OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2954|回复: 11

STM32 串口不能循环输出问题

[复制链接]

7

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1148
金钱
1148
注册时间
2019-9-9
在线时间
171 小时
发表于 2019-12-18 16:42:33 | 显示全部楼层 |阅读模式
5金钱
各位大神,帮忙看看;
在main里面,串口循环输出,22,可以输从串口助手这边,只看到7个22就没有,需要断电再连续,然后发送7个22又没有,为什么不能重复发送呢?
小白请大神帮忙,谢谢~

while(1)
        {
                USART_SendData(USART2,0x22);
                USART_ClearFlag(USART1,USART_FLAG_TXE);
                Delay_ms(100);
        }



串口输出.png

最佳答案

查看完整内容[请看2#楼]

已经解决,谢谢各位
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1148
金钱
1148
注册时间
2019-9-9
在线时间
171 小时
 楼主| 发表于 2019-12-18 16:42:34 | 显示全部楼层
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5140
金钱
5140
注册时间
2014-8-26
在线时间
1317 小时
发表于 2019-12-18 18:12:27 | 显示全部楼层
debug调试看下是不是卡死在什么地方了
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-12-18 18:18:45 | 显示全部楼层
USART2 发送为啥清除 USART1啊?

贴图贴一半,神仙也难办呀。
茵茵猪头
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2019-12-18 18:26:30 | 显示全部楼层
发送串口与清除的串口不一样
回复

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-12-18 19:10:41 | 显示全部楼层
帮顶                                                
成功没有捷径
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-12-19 01:32:28 | 显示全部楼层
仿真一下,立马知道为啥了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1148
金钱
1148
注册时间
2019-9-9
在线时间
171 小时
 楼主| 发表于 2019-12-19 10:33:26 | 显示全部楼层
谢谢各位,
不好意思,犯了个小错误,改成:
while(1)
        {
                USART_SendData(USART2,0x22);
                USART_ClearFlag(USART2,USART_FLAG_TXE);
                Delay_ms(100);
        }

还是会出现问题,显示“22 22 22 22 22 22 22 22 22”,重新断电显示有时是7个22,有时是8个。
仿真发现停在LDR R0,=SystemInit,已经尝试去掉所以断点,也扩大了Stack_Size      EQU     0x00000800。
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
856
金钱
856
注册时间
2015-2-12
在线时间
352 小时
发表于 2019-12-19 10:56:36 | 显示全部楼层
狗动作了?
回复

使用道具 举报

3

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
434
金钱
434
注册时间
2013-3-18
在线时间
82 小时
发表于 2019-12-19 22:06:46 | 显示全部楼层
肯定触发ORE了,建议在发送之前判断TXE标志位,TXE标志位不需要手动清除,后面那句没有意义
回复

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2019-7-17
在线时间
48 小时
发表于 2019-12-20 15:25:37 | 显示全部楼层
void UartDebugSend( UINT8 *p , UINT16 cnt )
{
  UINT16 send_index = 0;
               
  while( send_index < cnt )
  {                       
    UINT16 time_out = 0;

    while ( !( UartTerm.Instance->STATUS & USART_STATUS_TXBL ) && ( time_out++ < 0xFF ));  // 等待发送为空标志置位,然后发送新的数据

    UartTerm.Instance->TXDATA = ( UINT8 )( p[send_index++] & ( UINT8 )0xFFU );
  }
}
回复

使用道具 举报

7

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1148
金钱
1148
注册时间
2019-9-9
在线时间
171 小时
 楼主| 发表于 2019-12-20 15:29:09 | 显示全部楼层
holy404290384 发表于 2019-12-19 22:06
肯定触发ORE了,建议在发送之前判断TXE标志位,TXE标志位不需要手动清除,后面那句没有意义

我在发送前判断TXE标志位,串口助手上就没有显示了。

我尝试使用printf打印输出

int main(void)
{       

  USART_Config();       
        while(1)
        {       
        printf( "22 \n");       
        printf( "33 \n");               
        }
}

其他相关配置:
UART相关的配置:

void USART_Config(void)
{      GPIO_InitTypeDef GPIO_InitStructure;        USART_InitTypeDef USART_InitStructure;
        DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
        DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
        
        USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
        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_Rx | USART_Mode_Tx;
        USART_Init(DEBUG_USARTx, &USART_InitStructure);
        
        NVIC_Configuration();
        USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);        
        USART_Cmd(DEBUG_USARTx, ENABLE);               
        USART_ClearFlag(USART1, USART_FLAG_TC);     
}

/// 重定向C库函数printf到USART2
int fputc(int ch, FILE *f)
{
                DEBUG_USARTx->SR;
                USART_SendData(DEBUG_USARTx, (uint8_t) ch);
                while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE)== RESET);               
                return (ch);
}       


串口助手可以正常显示一部分后乱码,然后就没有数据传输,需要重新断电后,传输部分数据,乱码,...
串口6.png
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-21 05:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表