你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f4如何实现双串口输出,而不发生冲突?

[复制链接]
ataudio 提问时间:2015-1-26 13:53 /
阅读主题, 点击返回1楼
收藏 评论21 发布时间:2015-1-26 13:53
21个回答
ataudio 回答时间:2015-1-26 19:45:51
QianFan 发表于 2015-1-26 17:12
肯定是你程序的原因。当时我用429的时候,一次开4个没问题。103试过一次开两个也没问题。不过没有用printf ...

main(){
...
uart_init();
...
for(i=0;i<8;i++)
            {
                while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
                USART_SendData(USART2, A);
            }
...
输出到uart3:
if (stArgPosOffset.iPos < 125)
            {
                for(i=0;i<ADC3_RAM_SIZE;i++)
                {
                    printf("%d\n",ADC3Value);
                }
            }
.....
}

  1. void uart_init(void)
  2. {
  3.     USART_InitTypeDef USART_InitStructure;
  4.     GPIO_InitTypeDef GPIO_InitStructure;

  5.     /* 开启GPIO_A | D的时钟 */
  6.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  7.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  8.     /*开启USART2 | USART3*/
  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  10.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

  11.     /*A2 is TX,A3 is RX*/
  12.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  13.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  14.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  16.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
  17.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  18.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3;
  19.     GPIO_Init(GPIOA, &GPIO_InitStructure);


  20.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
  21.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);


  22.     USART_InitStructure.USART_BaudRate   = 115200;
  23.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  24.     USART_InitStructure.USART_StopBits   = USART_StopBits_1;
  25.     USART_InitStructure.USART_Parity     = USART_Parity_No;
  26.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  27.     USART_InitStructure.USART_Mode                = USART_Mode_Tx | USART_Mode_Rx;

  28.     USART_Init(USART2, &USART_InitStructure);
  29.       
  30.     USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);

  31.     /*使能USART2*/
  32.     USART_Cmd(USART2, ENABLE);

  33.     /*PD8 is TX,PD9 is RX*/
  34.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  35.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  36.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  37.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  38.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
  39.     GPIO_Init(GPIOD, &GPIO_InitStructure);

  40.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
  41.     GPIO_Init(GPIOD, &GPIO_InitStructure);


  42.     GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_USART3);
  43.     GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_USART3);


  44.     USART_InitStructure.USART_BaudRate   = 115200;
  45.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  46.     USART_InitStructure.USART_StopBits   = USART_StopBits_1;
  47.     USART_InitStructure.USART_Parity     = USART_Parity_No;
  48.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  49.     USART_InitStructure.USART_Mode                = USART_Mode_Tx | USART_Mode_Rx;

  50.     USART_Init(USART3, &USART_InitStructure);

  51.     /* 使能串口 */
  52.     USART_Cmd(USART3, ENABLE);
  53. }


  54. int fputc(int ch, FILE *f)
  55. {
  56.     /* Place your implementation of fputc here */
  57.     /* e.g. write a character to the USART */
  58.     USART_SendData(USART3, (uint8_t) ch);

  59.     /* Loop until the end of transmission */
  60.     while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET)
  61.     {}

  62.     return ch;
  63. }

  64. void USART2_IRQHandler(void)
  65. {
  66.     unsigned char ch;                               
  67.     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  68.     {
  69.         /* Read one byte from the receive data register */
  70.         ch = (USART_ReceiveData(USART2));

  71.         USART_SendData(USART2, (uint8_t) ch);
  72.     }         
  73. }


  74. void USART3_IRQHandler(void)
  75. {
  76.     unsigned char ch;                               
  77.     if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
  78.     {
  79.         /* Read one byte from the receive data register */
  80.         ch = (USART_ReceiveData(USART3));
  81.         USART_SendData(USART3, (uint8_t) ch);
  82.     }         
  83. }

复制代码

二十四节气~霜降

二十四节气~霜降
ataudio 回答时间:2015-1-26 19:48:08
我上面的串口输出,根据代码条件选择,任意只使用一个输出时都正常。一旦条件满足,需要另一个也被调用到时,就不正常了。俩串口都停止。
lkl0305 回答时间:2015-1-26 20:03:49
自己写个printf试试,没遇到过
holts1 回答时间:2015-1-27 08:03:37
谢谢分享
回答时间:2015-1-27 10:10:28
理论上是没有冲突的,这样只能先看看死在哪个位置了。
逍遥李 回答时间:2015-1-27 10:31:53
加班要到年底了,手里有f091还没来得及研究
wu1169668869 回答时间:2015-1-27 12:42:55
逍遥李 发表于 2015-1-27 10:31
加班要到年底了,手里有f091还没来得及研究

同加班…板子放了一周了orz
dsjsjf 回答时间:2015-1-27 12:57:23
仔细检查程序
QianFan 回答时间:2015-1-27 13:04:54
逍遥李 发表于 2015-1-27 10:31
加班要到年底了,手里有f091还没来得及研究

这是一个凄惨的故事。。。
ataudio 回答时间:2015-1-27 13:13:00
本帖最后由 ataudio 于 2015-1-27 13:21 编辑

最新确定消息:上面的代码运行没什么问题,两串口同时输出都OK了,但是将printf放到了Uart_sendData()代码段的前面,就是说先printf,后Uart_sendData()就会出现两打印口都停止输出。


原因不详。分析来说,于理不合。


二十四节气~立冬

二十四节气~立冬

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版