电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>单片机>STM32串口例程与stm32虚拟串口例程大合集分享(例程丰富案例典型)

STM32串口例程与stm32虚拟串口例程大合集分享(例程丰富案例典型)

2018-01-10 | zip | 6030KB | 次下载 | 1积分

资料介绍

STM32串口例程和stm32虚拟串口例程。非常不错的资料

STM32串口程序的一般配置方法


#include "stm32f10x.h"
 
 
/************************************************
该程序讲解串口程序的一般配置方法:
步骤为:
        1、先对端口进行复用或者重映射操作(该程序中是对端口进行复用操作)
        2、串口复位,函数为USART_DeInit();
        3、串口初始化:USART_Init();
        4、中断初始化:    NVIC_Init();
        5、串口使能:USART_Cmd();
        6、开启中断:USART_ITConfig();
        7、编写中断处理函数:void USART1_IRQHandler(void)    
        
                                                                                briangooole@gmail.com
                                                                                   于2017年06月29日
-------------------------
USART_TX     |    PA9
-------------------------
USART_RX     |    PA10
-------------------------
************************************************/
 
 
void MY_USART_Init(void)
{
 
    
    GPIO_InitTypeDef GPIO_InitStrue;     //在GPIO_Init函数调用时需定义一个GPIO_InitTypeDef结构体类型变量
    USART_InitTypeDef USART_InitStrue;    //USART_Init函数调用时需定义一个USART_InitTypeDef结构体类型变量
    NVIC_InitTypeDef NVIC_InitStrue;    //USART_Init函数调用时需定义一个NVIC_InitTypeDef结构体类型变量
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        //由于串口功能是GPIO的第二功能,所以要对端口进行复用操作,
        //一般步骤为:GPIO时钟使能-》复用的外设时钟使能-》将端口按照复用的功能进行模式配置
    
    USART_DeInit(USART1);    //串口复位
    
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    //复用功能推挽输出模式
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;    //PA9
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置输出速度
    GPIO_Init(GPIOA,&GPIO_InitStrue);
    
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;    //浮空输入模式
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;    //PA10
    GPIO_Init(GPIOA,&GPIO_InitStrue);
    
 
    
    USART_InitStrue.USART_BaudRate=9600;//设置波特率9600
    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制,相关寄存器为CR3
    USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//模式为接收和发送
    USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验位0x0000,相关寄存器为SR1的PS位
    USART_InitStrue.USART_StopBits=USART_StopBits_1;    //1个停止位
    USART_InitStrue.USART_WordLength=USART_WordLength_8b;    //数据长度为8位
    USART_Init(USART1,&USART_InitStrue);    //串口初始化
    
    
    NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn; //串口1对应的中断名称
    NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;    //使能该中断通道
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级为2,因为此程序只有一个中断,故可任意设置
    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//响应优先级为1,因为此程序只有一个中断,故可任意设置
    NVIC_Init(&NVIC_InitStrue);    //中断初始化
    
    USART_Cmd(USART1,ENABLE); //串口使能  就是将寄存器CR1中的UE位置1
    
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能串口中断,也叫开启串口中断,第二个参数是设置具体开启哪种中断,具体为寄存器SR
 
}
 
 
void USART1_IRQHandler(void)        //中断函数
{
    u16 DATA;
    if(USART_GetITStatus(USART1,USART_IT_RXNE))//判断如果收到了数据,收到数据CR1中RXNE位为1,该函数的返回值为1,则执行if包含的语句
    {
    DATA=USART_ReceiveData(USART1);//读取数据
    USART_SendData(USART1,DATA);//发送读到的数据
    }
 
}
 
int main(void) //主函数
 {    
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//进行中断分组,分为2组:2位抢占优先级,2位响应优先级
      MY_USART_Init();    //调用串口初始化函数
        while(1);  //等待中端发生
     
 }

 STM32串口库函数版例程


定义:
TXD1----- PA9-US1-TX
RXD1----- PA10-US1-RX

速率:115200,n,8,1 

  1. /* Includes ------------------------------------------------------------------*/  
  2. #include "stm32f10x.h"  
  3. #include "platform_config.h"  
  4. #include "stm32f10x_usart.h"  
  5. #include "misc.h"  
  6. #include "stdarg.h"  
  7.   
  8.   
  9.   
  10. /* Private variables ---------------------------------------------------------*/  
  11. USART_InitTypeDef USART_InitStructure;  
  12. uint8_t TxBuffer1[] = "USART Interrupt Example: This is USART1 DEMO";    
  13. uint8_t RxBuffer1[],rec_f,tx_flag;  
  14. __IO uint8_t TxCounter1 = 0x00;  
  15. __IO uint8_t RxCounter1 = 0x00;   
  16.   
  17. uint32_t Rec_Len;  
  18.   
  19.   
  20. /* Private function prototypes -----------------------------------------------*/  
  21. void RCC_Configuration(void);  
  22. void GPIO_Configuration(void);  
  23. void NVIC_Configuration(void);  
  24.   
  25. void Delay(__IO uint32_t nCount);  
  26. void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);  
  27. char *itoa(int value, char *string, int radix);  
  28. void USART_Config(USART_TypeDef* USARTx);  
  29.   
  30.   
  31. GPIO_InitTypeDef GPIO_InitStructure;  
  32. USART_InitTypeDef USART_InitStruct;  
  33. USART_ClockInitTypeDef USART_ClockInitStruct;  
  34.   
  35. /**************************************************************************** 
  36. * 名    称:void ili9325_DrawPicture(u16 StartX,u16 StartY, u8 Dir,u8 *pic) 
  37. * 功    能:在指定座标范围显示一副图片 
  38. * 入口参数:StartX     行起始座标 
  39. *           StartY     列起始座标 
  40. *           Dir        图像显示方向        
  41. *           pic        图片头指针 
  42. * 出口参数:无 
  43. * 说    明:图片取模格式为水平扫描,16位颜色模式  取模软件img2LCD 
  44. * 调用方法:ili9325_DrawPicture(0,0,0,(u16*)demo); 
  45. ****************************************************************************/  
  46. void USART_Config(USART_TypeDef* USARTx){  
  47.   USART_InitStructure.USART_BaudRate = 115200;                      //速率115200bps  
  48.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;       //数据位8位  
  49.   USART_InitStructure.USART_StopBits = USART_StopBits_1;            //停止位1位  
  50.   USART_InitStructure.USART_Parity = USART_Parity_No;               //无校验位  
  51.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流控  
  52.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                   //收发模式  
  53.   
  54.   /* Configure USART1 */  
  55.   USART_Init(USARTx, &USART_InitStructure);                         //配置串口参数函数  
  56.    
  57.     
  58.   /* Enable USART1 Receive and Transmit interrupts */  
  59.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //使能接收中断  
  60.   USART_ITConfig(USART1, USART_IT_TXE, ENABLE);                     //使能发送缓冲空中断     
  61.   
  62.   /* Enable the USART1 */  
  63.   USART_Cmd(USART1, ENABLE);      
  64. }  
  65. /**************************************************************************** 
  66. * 名    称:int main(void) 
  67. * 功    能:主函数 
  68. * 入口参数:无 
  69. * 出口参数:无 
  70. * 说    明: 
  71. * 调用方法:无  
  72. ****************************************************************************/  
  73. int main(void)  
  74. {  
  75.   
  76.    uint8_t a=0;  
  77.   /* System Clocks Configuration */  
  78.   RCC_Configuration();                                            //系统时钟设置  
  79.          
  80.   /*嵌套向量中断控制器  
  81.       说明了USART1抢占优先级级别0(最多1位) ,和子优先级级别0(最多7位) */   
  82.   NVIC_Configuration();                                           //中断源配置  
  83.   
  84.   /*对控制LED指示灯的IO口进行了初始化,将端口配置为推挽上拉输出,口线速度为50Mhz。PA9,PA10端口复用为串口1的TX,RX。 
  85.   在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B, 因此要对这个端口的时钟 
  86.   进行使能,同时由于用到复用IO口功能用于配置串口。因此还要使能AFIO(复用功能IO)时钟。*/  
  87.   GPIO_Configuration();                                           //端口初始化  
  88.   
  89.   USART_Config(USART1);                                           //串口1初始化  
  90.     
  91.   USART_OUT(USART1,"****测试串口 *******\r\n");       //向串口1发送开机字符。  
  92.           
  93.   USART_OUT(USART1,"***************************************************\r\n");   
  94.   USART_OUT(USART1,"\r\n");   
  95.   USART_OUT(USART1,"\r\n");       
  96.    while (1)  
  97.   {  
  98.     if(rec_f==1){                                                 //判断是否收到一帧有效数据  
  99.         rec_f=0;  
  100.         USART_OUT(USART1,"\r\n您发送的信息为: \r\n");      
  101.         USART_OUT(USART1,&TxBuffer1[0]);  
  102.         if(a==0) {GPIO_SetBits(GPIOB, GPIO_Pin_5); a=1;}          //LED1  V6(V3板) V2(MINI板) 明暗闪烁                  
  103.         else {GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=0;  }  
  104.     }  
  105.   }  
  106. }  
  107.   
  108. /**************************************************************************** 
  109. * 名    称:void Delay(__IO uint32_t nCount) 
  110. * 功    能:延时函数 
  111. * 入口参数:无 
  112. * 出口参数:无 
  113. * 说    明: 
  114. * 调用方法:无  
  115. ****************************************************************************/  
  116. void Delay(__IO uint32_t nCount)  
  117. {  
  118.   for(; nCount != 0; nCount--);  
  119. }  
  120.   
  121. /**************************************************************************** 
  122. * 名    称:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...) 
  123. * 功    能:格式化串口输出函数 
  124. * 入口参数:USARTx:  指定串口 
  125.             Data:   发送数组 
  126.             ...:     不定参数 
  127. * 出口参数:无 
  128. * 说    明:格式化串口输出函数 
  129.             "\r"    回车符    USART_OUT(USART1, "abcdefg\r")    
  130.             "\n"    换行符    USART_OUT(USART1, "abcdefg\r\n") 
  131.             "%s"    字符串    USART_OUT(USART1, "字符串是:%s","abcdefg") 
  132.             "%d"    十进制    USART_OUT(USART1, "a=%d",10) 
  133. * 调用方法:无  
  134. ****************************************************************************/  
  135. void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){   
  136.     const char *s;  
  137.     int d;  
  138.     char buf[16];  
  139.     va_list ap;  
  140.     va_start(ap, Data);  
  141.   
  142.     while(*Data!=0){                                          //判断是否到达字符串结束符  
  143.         if(*Data==0x5c){                                      //'\'  
  144.             switch (*++Data){  
  145.                 case 'r':                                     //回车符  
  146.                     USART_SendData(USARTx, 0x0d);        
  147.   
  148.                     Data++;  
  149.                     break;  
  150.                 case 'n':                                     //换行符  
  151.                     USART_SendData(USARTx, 0x0a);     
  152.                     Data++;  
  153.                     break;  
  154.                   
  155.                 default:  
  156.                     Data++;  
  157.                     break;  
  158.             }  
  159.               
  160.                
  161.         }  
  162.         else if(*Data=='%'){                                      //  
  163.             switch (*++Data){                 
  164.                 case 's':                                         //字符串  
  165.                     s = va_arg(ap, const char *);  
  166.                     for ( ; *s; s++) {  
  167.                         USART_SendData(USARTx,*s);  
  168.                         while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);  
  169.                     }  
  170.                     Data++;  
  171.                     break;  
  172.                 case 'd':                                         //十进制  
  173.                     d = va_arg(ap, int);  
  174.                     itoa(d, buf, 10);  
  175.                     for (s = buf; *s; s++) {  
  176.                         USART_SendData(USARTx,*s);  
  177.                         while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);  
  178.                     }  
  179.                     Data++;  
  180.                     break;  
  181.                 default:  
  182.                     Data++;  
  183.                     break;  
  184.             }          
  185.         }  
  186.         else USART_SendData(USARTx, *Data++);  
  187.         while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);  
  188.     }  
  189. }  
  190.   
  191. /****************************************************** 
  192.         整形数据转字符串函数 
  193.         char *itoa(int value, char *string, int radix) 
  194.         radix=10 标示是10进制    非十进制,转换结果为0;   
  195.  
  196.         例:d=-379; 
  197.         执行  itoa(d, buf, 10); 后 
  198.          
  199.         buf="-379"                                         
  200. **********************************************************/  
  201. char *itoa(int value, char *string, int radix)  
  202. {  
  203.     int     i, d;  
  204.     int     flag = 0;  
  205.     char    *ptr = string;  
  206.   
  207.     /* This implementation only works for decimal numbers. */  
  208.     if (radix != 10)  
  209.     {  
  210.         *ptr = 0;  
  211.         return string;  
  212.     }  
  213.   
  214.     if (!value)  
  215.     {  
  216.         *ptr++ = 0x30;  
  217.         *ptr = 0;  
  218.         return string;  
  219.     }  
  220.   
  221.     /* if this is a negative value insert the minus sign. */  
  222.     if (value < 0)  
  223.     {  
  224.         *ptr++ = '-';  
  225.   
  226.         /* Make the value positive. */  
  227.         value *= -1;  
  228.     }  
  229.   
  230.     for (i = 10000; i > 0; i /= 10)  
  231.     {  
  232.         d = value / i;  
  233.   
  234.         if (d || flag)  
  235.         {  
  236.             *ptr++ = (char)(d + 0x30);  
  237.             value -= (d * i);  
  238.             flag = 1;  
  239.         }  
  240.     }  
  241.   
  242.     /* Null terminate the string. */  
  243.     *ptr = 0;  
  244.   
  245.     return string;  
  246.   
  247. /* NCL_Itoa */  
  248.   
  249. /**************************************************************************** 
  250. * 名    称:void RCC_Configuration(void) 
  251. * 功    能:系统时钟配置为72MHZ, 外设时钟配置 
  252. * 入口参数:无 
  253. * 出口参数:无 
  254. * 说    明: 
  255. * 调用方法:无  
  256. ****************************************************************************/   
  257. void RCC_Configuration(void)  
  258. {  
  259.    SystemInit();   
  260.    RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO  , ENABLE);    
  261. }  
  262.   
  263. /**************************************************************************** 
  264. * 名    称:void GPIO_Configuration(void) 
  265. * 功    能:通用IO口配置 
  266. * 入口参数:无 
  267. * 出口参数:无 
  268. * 说    明: 
  269. * 调用方法: 
  270. ****************************************************************************/    
  271. void GPIO_Configuration(void)  
  272. {  
  273.   
  274.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                  //LED1控制--PB5  
  275.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           //推挽输出  
  276.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  277.   GPIO_Init(GPIOB, &GPIO_InitStructure);                       
  278.   
  279.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                  //USART1 TX  
  280.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;            //复用推挽输出  
  281.   GPIO_Init(GPIOA, &GPIO_InitStructure);                     //A端口   
  282.   
  283.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                 //USART1 RX  
  284.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;      //复用开漏输入  
  285.   GPIO_Init(GPIOA, &GPIO_InitStructure);                     //A端口   
  286. }  
  287.   
  288. /**************************************************************************** 
  289. * 名    称:void NVIC_Configuration(void) 
  290. * 功    能:中断源配置 
  291. * 入口参数:无 
  292. * 出口参数:无 
  293. * 说    明: 
  294. * 调用方法:无  
  295. ****************************************************************************/  
  296. void NVIC_Configuration(void)  
  297. {  
  298.   /*  结构声明*/  
  299.   NVIC_InitTypeDef NVIC_InitStructure;  
  300.   
  301.   /* Configure the NVIC Preemption Priority Bits */    
  302.   /* Configure one bit for preemption priority */  
  303.   /* 优先级组 说明了抢占优先级所用的位数,和子优先级所用的位数   在这里是1, 7 */      
  304.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);       
  305.     
  306.   
  307.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                 //设置串口1中断  
  308.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         //抢占优先级 0  
  309.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                //子优先级为0  
  310.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                   //使能  
  311.   NVIC_Init(&NVIC_InitStructure);  
  312. }  
 
[cpp] view plain copy
 
  1. /******************************************************************************/  
  2. /*            STM32F10x Peripherals Interrupt Handlers                        */  
  3. /******************************************************************************/  
  4.   
  5.   
  6. /** 
  7.   * @brief  This function handles USART1 global interrupt request. 
  8.   * @param  None 
  9.   * @retval : None 
  10.   */  
  11. void USART1_IRQHandler(void)      //串口1 中断服务程序  
  12. {  
  13.   unsigned int i;  
  14.   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)    //判断读寄存器是否非空  
  15.   {   
  16.       
  17.     RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);   //将读寄存器的数据缓存到接收缓冲区里  
  18.       
  19.     if(RxBuffer1[RxCounter1-2]==0x0d&&RxBuffer1[RxCounter1-1]==0x0a)     //判断结束标志是否是0x0d 0x0a  
  20.     {  
  21.       for(i=0; i< RxCounter1; i++) TxBuffer1[i]  = RxBuffer1[i];          //将接收缓冲器的数据转到发送缓冲区,准备转发  
  22.       rec_f=1;                                                           //接收成功标志  
  23.       TxBuffer1[RxCounter1]=0;                                           //发送缓冲区结束符      
  24.       RxCounter1=0;  
  25.         
  26.     }  
  27.   }  
  28.     
  29.   if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)                   //这段是为了避免STM32 USART 第一个字节发不出去的BUG   
  30.   {   
  31.      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);                      //禁止发缓冲器空中断,   
  32.   }   
  33.     
  34. }  


 

评论

查看更多

下载排行

本周

  1. 1TC358743XBG评估板参考手册
  2. 1.36 MB  |  330次下载  |  免费
  3. 2开关电源基础知识
  4. 5.73 MB  |  6次下载  |  免费
  5. 3100W短波放大电路图
  6. 0.05 MB  |  4次下载  |  3 积分
  7. 4嵌入式linux-聊天程序设计
  8. 0.60 MB  |  3次下载  |  免费
  9. 5基于FPGA的光纤通信系统的设计与实现
  10. 0.61 MB  |  2次下载  |  免费
  11. 651单片机窗帘控制器仿真程序
  12. 1.93 MB  |  2次下载  |  免费
  13. 751单片机大棚环境控制器仿真程序
  14. 1.10 MB  |  2次下载  |  免费
  15. 8基于51单片机的RGB调色灯程序仿真
  16. 0.86 MB  |  2次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33564次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6653次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537796次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420026次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191185次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费