23809|12

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F103C8T6串口1与串口2共存问题 [复制链接]

 
  1. /****************************************************************************
  2. * Copyright (C), 2014 奋斗嵌入式工作室 www.ourstm.net
  3. *
  4. * 本例程在 奋斗版STM32开发板TINY上调试通过           
  5. * QQ: 9191274, 旺旺:sun68, Email: sun68@163.com
  6. * 淘宝店铺:ourstm.taobao.com  
  7. *
  8. * 文件名: main.c
  9. * 内容简述:
  10. *       演示 USART1 当接收到结束符是0x0d 0x0a的数据串时,将接收到的数据传送出去
  11.                        V1 LED1闪烁表示正在收发数据。
  12. *
  13. 定义:       
  14.         TXD1----- PA9-US1-TX
  15.         RXD1----- PA10-US1-RX
  16.         速率:115200,n,8,1
  17. * 文件历史:
  18. * 版本号  日期       作者    说明
  19. * v0.1    2014-4-11 sun68  创建该文件
  20. *
  21. */
  22. /* Includes ------------------------------------------------------------------*/
  23. #include "stm32f10x.h"
  24. #include "stm32f10x_usart.h"
  25. #include "misc.h"
  26. #include "stdarg.h"



  27. /* Private variables ---------------------------------------------------------*/
  28. USART_InitTypeDef USART_InitStructure;
  29. uint8_t TxBuffer1[] = "USART Interrupt Example: This is USART1 DEMO";  
  30. uint8_t RxBuffer1[],rec_f,tx_flag;
  31. __IO uint8_t TxCounter1 = 0x00;//发送缓冲区
  32. __IO uint8_t RxCounter1 = 0x00;//接收缓冲区
  33. __IO uint8_t TxCounter2 = 0x00;//发送缓冲区
  34. __IO uint8_t RxCounter2 = 0x00;//接收缓冲区  

  35. uint32_t Rec_Len;


  36. /* Private function prototypes -----------------------------------------------*/
  37. void RCC_Configuration(void);
  38. void GPIO_Configuration(void);
  39. void NVIC_Configuration(void);

  40. void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);
  41. char *itoa(int value, char *string, int radix);
  42. void USART_Config();



  43. /****************************************************************************
  44. * 名    称:USART_Config(USART_TypeDef* USARTx)
  45. * 功    能:配置串口
  46. * 入口参数:
  47. * 出口参数:无
  48. * 说    明:
  49. * 调用方法:例如: USART_Config(USART1)
  50. ****************************************************************************/
  51. void USART_Config(){  
  52.   USART_InitTypeDef USART_InitStruct;
  53.   USART_InitStructure.USART_BaudRate = 9600;                                                //速率115200bps
  54.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //数据位8位
  55.   USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //停止位1位
  56.   USART_InitStructure.USART_Parity = USART_Parity_No;                                //无校验位
  57.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流控
  58.   USART_InitStructure.USART_Mode = USART_Mode_Tx;                                        //收发模式
  59.   USART_Init(USART1, &USART_InitStructure);                                                        //配置串口参数函数
  60.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //使能接收中断
  61.   USART_ITConfig(USART1, USART_IT_TXE, ENABLE);                                                //使能发送缓冲空中断
  62.   USART_Cmd(USART1, ENABLE);
  63.                            
  64.    //串2
  65.   USART_InitStructure.USART_BaudRate = 9600;                                                //速率115200bps
  66.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //数据位8位
  67.   USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //停止位1位
  68.   USART_InitStructure.USART_Parity = USART_Parity_No;                                //无校验位
  69.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流控
  70.   USART_InitStructure.USART_Mode = USART_Mode_Tx;                                        //收发模式USART_Mode_Rx | USART_Mode_Tx;
  71.   USART_Init(USART2, &USART_InitStructure);                                                        //配置串口参数函数
  72.   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);                    //使能接收中断
  73.   USART_ITConfig(USART2, USART_IT_TXE, ENABLE);                                                //使能发送缓冲空中断   
  74.   USART_Cmd(USART2, ENABLE);                                                                                //打开串口二中断       
  75. }
  76. /****************************************************************************
  77. * 名    称:int main(void)
  78. * 功    能:奋斗板主函数
  79. * 入口参数:无
  80. * 出口参数:无
  81. * 说    明:
  82. * 调用方法:无
  83. ****************************************************************************/
  84. int main(void)
  85. {

  86.    uint8_t a=0;
  87.   /* System Clocks Configuration */
  88.   RCC_Configuration();                                                                                          //系统时钟设置
  89.       
  90.   /*嵌套向量中断控制器
  91.       配置了USART1的优先级分组为0,抢占优先级级别0(无) ,和响应优先级级别0(0-7) */
  92.   NVIC_Configuration();                                                                                          //中断源配置

  93.   /*对控制LED指示灯的IO口进行了初始化,将端口配置为推挽上拉输出,口线速度为50Mhz。PA9,PA10端口复用为串口1的TX,RX。
  94.   在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B, 因此要对这个端口的时钟
  95.   进行使能,同时由于用到复用IO口功能用于配置串口。因此还要使能AFIO(复用功能IO)时钟。*/
  96.   GPIO_Configuration();                                                                                          //端口初始化

  97.   USART_Config();                                                                                          //串口1初始化
  98.   
  99.   USART_OUT(USART1,"USART1FFF\r\n");                  
  100.   USART_OUT(USART2,"USART2\r\n");  
  101.   USART_OUT(USART1,"USART1FFF\r\n");           
  102.    while (1)
  103.   {
  104.         if(rec_f==1){                                                                                                  //判断是否收到一帧有效数据
  105.                 rec_f=0;
  106.                 USART_OUT(USART2,"\r\n您发送的信息为: \r\n");   
  107.                 USART_OUT(USART2,&TxBuffer1[0]);
  108.                 if(a==0) {GPIO_SetBits(GPIOB, GPIO_Pin_5); a=1;}          //LED1  V6(V3V5板) V2(MINI板) 明暗闪烁               
  109.                 else {GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=0;  }
  110.         }
  111.   }
  112. }

  113. /****************************************************************************
  114. * 名    称:void RCC_Configuration(void)
  115. * 功    能:系统时钟配置为72MHZ, 外设时钟配置
  116. * 入口参数:无
  117. * 出口参数:无
  118. * 说    明:
  119. * 调用方法:无
  120. ****************************************************************************/
  121. void RCC_Configuration(void)
  122. {
  123.    SystemInit();
  124.    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);
  125.    RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 , ENABLE);

  126.    //串2
  127.    RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE);   
  128. }

  129. /****************************************************************************
  130. * 名    称:void GPIO_Configuration(void)
  131. * 功    能:通用IO口配置
  132. * 入口参数:无
  133. * 出口参数:无
  134. * 说    明:
  135. * 调用方法:
  136. ****************************************************************************/  
  137. void GPIO_Configuration(void)
  138. {
  139.   GPIO_InitTypeDef GPIO_InitStructure;
  140.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                     //LED1控制--PB5
  141.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                         //推挽输出
  142.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  143.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                         

  144.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                  //USART1 TX
  145.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                     //复用推挽输出
  146.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                     //A端口

  147.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                          //USART1 RX
  148.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            //复用浮空输入
  149.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                  //A端口
  150.   
  151.    //串2
  152.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                  //USART2 TX
  153.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                     //复用推挽输出
  154.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                     //A端口

  155.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                                   //USART2 RX
  156.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            //复用开漏输入
  157.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                  //A端口

  158. }

  159. /****************************************************************************
  160. * 名    称:void NVIC_Configuration(void)
  161. * 功    能:中断源配置
  162. * 入口参数:无
  163. * 出口参数:无
  164. * 说    明:
  165. * 调用方法:无
  166. ****************************************************************************/
  167. void NVIC_Configuration(void)
  168. {
  169.   /*  结构声明*/
  170.   NVIC_InitTypeDef NVIC_InitStructure;

  171.   /* Configure the NVIC Preemption Priority Bits */  
  172.   /* Configure one bit for preemption priority */
  173.   /* 优先级组 说明了抢占优先级所用的位数,和响应优先级所用的位数   在这里是0, 4
  174.   0组:  抢占优先级占0位, 响应优先级占4位
  175.   1组:  抢占优先级占1位, 响应优先级占3位
  176.   2组:  抢占优先级占2位, 响应优先级占2位
  177.   3组:  抢占优先级占3位, 响应优先级占1位
  178.   4组:  抢占优先级占4位, 响应优先级占0位  
  179.   */                                
  180.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);            

  181.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                     //设置串口1中断
  182.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                     //抢占优先级 0
  183.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                //子优先级为0
  184.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能
  185.   NVIC_Init(&NVIC_InitStructure);  
  186.                                   
  187.    //串2
  188.   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                                     //设置串口2中断
  189.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;                     //抢占优先级 0
  190.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                //子优先级为0
  191.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能
  192.   NVIC_Init(&NVIC_InitStructure);
  193. }

  194. /****************************************************************************
  195. * 名    称:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)
  196. * 功    能:格式化串口输出函数
  197. * 入口参数:USARTx:  指定串口
  198.                         Data:   发送数组
  199.                         ...:     不定参数
  200. * 出口参数:无
  201. * 说    明:格式化串口输出函数
  202.                 "\r"        回车符           USART_OUT(USART1, "abcdefg\r")   
  203.                         "\n"        换行符           USART_OUT(USART1, "abcdefg\r\n")
  204.                         "%s"        字符串           USART_OUT(USART1, "字符串是:%s","abcdefg")
  205.                         "%d"        十进制           USART_OUT(USART1, "a=%d",10)
  206. * 调用方法:无
  207. ****************************************************************************/
  208. void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){
  209.         const char *s;
  210.     int d;
  211.     char buf[16];
  212.     va_list ap;
  213.     va_start(ap, Data);

  214.         while(*Data!=0){                                                          //判断是否到达字符串结束符
  215.                 if(*Data==0x5c){                                                                          //'\'
  216.                         switch (*++Data){
  217.                                 case 'r':                                                                  //回车符
  218.                                         USART_SendData(USARTx, 0x0d);          

  219.                                         Data++;
  220.                                         break;
  221.                                 case 'n':                                                                  //换行符
  222.                                         USART_SendData(USARTx, 0x0a);       
  223.                                         Data++;
  224.                                         break;
  225.                                
  226.                                 default:
  227.                                         Data++;
  228.                                     break;
  229.                         }
  230.                        
  231.                          
  232.                 }
  233.                 else if(*Data=='%'){                                                                          //
  234.                         switch (*++Data){                               
  235.                                 case 's':                                                                                  //字符串
  236.                         s = va_arg(ap, const char *);
  237.                         for ( ; *s; s++) {
  238.                             USART_SendData(USARTx,*s);
  239.                                                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
  240.                         }
  241.                                         Data++;
  242.                         break;
  243.                     case 'd':                                                                                  //十进制
  244.                         d = va_arg(ap, int);
  245.                         itoa(d, buf, 10);
  246.                         for (s = buf; *s; s++) {
  247.                             USART_SendData(USARTx,*s);
  248.                                                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
  249.                         }
  250.                                         Data++;
  251.                         break;
  252.                                 default:
  253.                                         Data++;
  254.                                     break;
  255.                         }                 
  256.                 }
  257.                 else USART_SendData(USARTx, *Data++);
  258.                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
  259.         }
  260. }

  261. /******************************************************
  262.                 整形数据转字符串函数
  263.         char *itoa(int value, char *string, int radix)
  264.                 radix=10 标示是10进制        非十进制,转换结果为0;  

  265.             例:d=-379;
  266.                 执行        itoa(d, buf, 10); 后
  267.                
  268.                 buf="-379"                                                                                     
  269. **********************************************************/
  270. char *itoa(int value, char *string, int radix)
  271. {
  272.     int     i, d;
  273.     int     flag = 0;
  274.     char    *ptr = string;

  275.     /* This implementation only works for decimal numbers. */
  276.     if (radix != 10)
  277.     {
  278.         *ptr = 0;
  279.         return string;
  280.     }

  281.     if (!value)
  282.     {
  283.         *ptr++ = 0x30;
  284.         *ptr = 0;
  285.         return string;
  286.     }

  287.     /* if this is a negative value insert the minus sign. */
  288.     if (value < 0)
  289.     {
  290.         *ptr++ = '-';

  291.         /* Make the value positive. */
  292.         value *= -1;
  293.     }

  294.     for (i = 10000; i > 0; i /= 10)
  295.     {
  296.         d = value / i;

  297.         if (d || flag)
  298.         {
  299.             *ptr++ = (char)(d + 0x30);
  300.             value -= (d * i);
  301.             flag = 1;
  302.         }
  303.     }

  304.     /* Null terminate the string. */
  305.     *ptr = 0;

  306.     return string;

  307. } /* NCL_Itoa */
  308. /******************* (C) COPYRIGHT 2013 奋斗STM32 *****END OF FILE****/
复制代码

串口1-2DEMO.zip

293.92 KB, 下载次数: 334

简洁串口源码

此帖出自stm32/stm8论坛

最新回复

请问怎么解决的?  详情 回复 发表于 2017-5-19 15:13
点赞 关注(3)
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
说明:
/****************************************************************************
* 名    称:void RCC_Configuration(void)
* 功    能:系统时钟配置为72MHZ, 外设时钟配置
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无
****************************************************************************/
void RCC_Configuration(void)
{
   SystemInit();
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 , ENABLE);//注解这句串口2正常

   //串2
   RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE); //注解这句串口1正常
}
单独打开一个串口可以正常工作,如果两个同时打开,则两个都不能正常使用.求助.
此帖出自stm32/stm8论坛
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
问题已解决!
此帖出自stm32/stm8论坛
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

4
 
是不是 GROUP0 抢占优先级不能设为1
此帖出自stm32/stm8论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

5
 
问题肯定不在这里
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
好,谢谢楼主
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
你好,我也遇到相同问题,请问有什么办法解决
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 

请问楼主怎么解决?
此帖出自stm32/stm8论坛
 
 
 

回复

164

帖子

0

TA的资源

一粒金砂(中级)

9
 
串口1和串口2 是可以正常用的,这个没问题的。
此帖出自stm32/stm8论坛
 
个人签名专业电子方案/zigbee方案设计,毕业设计。QQ:1397905781
 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

10
 
本来几个串口就是可以共存的,这个无需多疑,要么就是没有配置好
此帖出自stm32/stm8论坛
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

11
 
是不是这句话搞得鬼?

GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
此帖出自stm32/stm8论坛
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

12
 
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);   //将读寄存器的数据缓存到接收缓冲区里
       
    if(RxBuffer1[RxCounter1-2]==0x0d&&RxBuffer1[RxCounter1-1]==0x0a)     //判断结束标志是否是0x0d 0x0a
    {
          for(i=0; i< RxCounter1; i++) TxBuffer1[i]        = RxBuffer1[i];              //将接收缓冲器的数据转到发送缓冲区,准备转发
          rec_f=1;                                                                                                                         //接收成功标志
          TxBuffer1[RxCounter1]=0;                                                     //发送缓冲区结束符   
          RxCounter1=0;
          
    }

这里面写错了,串口2的中断处理程序处,RxCounter1=0;改成RxCounter2=0;
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

13
 
2934036269 发表于 2014-7-17 23:54
说明:
/****************************************************************************
* 名    称:vo ...

请问怎么解决的?
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表