OpenEdv-开源电子网

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

STM32F103zet6 USART1 不能同时收发?

[复制链接]

18

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-3-24
在线时间
5 小时
发表于 2018-9-28 09:36:57 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 sfraim 于 2018-9-28 10:21 编辑

STM32F103zet6 USART1  不能同时收发?我要实现:主程序里循环发送数据,同时在中断里接收数据,但是发现无法工作,
只有停止持续循环发送时才能在中断里接收数据,这是咋回事?
附上代码
//初始化
void USART1_Int(u16 baud)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
USART_DeInit(USART1);   
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//USART1_TX   PA.9   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX   PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);  
USART_InitStructure.USART_BaudRate = baud;
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(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);                     
}

//主程序循环持续调用这个函数发送数据,发送是成功的,上位机可以收到
int SendData(USART_TypeDef * USARTx,uint8_t ch)
{
USART_SendData(USARTx, (uint8_t) ch);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET) {}
return ch;
}

//问题来了,中断里接收数据 --------- 如果主程序持续发送中,这个接收中断好像就没有触发(上位机发100个字节,也许就1个字节能触发中断),除非主程序停止循环发送,这个中断才会触发,我才能接收到数据
void USART1_IRQHandler(void)
{
u8 ch = 0,i = 0,chck = 0;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
   ch = (USART_ReceiveData(USART1));//这是接收字符
  }
}


最佳答案

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

已经解决了,是我的无线串口模块半双工导致,导致了我浪费了不少时间
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-3-24
在线时间
5 小时
 楼主| 发表于 2018-9-28 09:36:58 | 显示全部楼层
已经解决了,是我的无线串口模块半双工导致,导致了我浪费了不少时间
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-9-28 10:28:25 | 显示全部楼层
主程序里面发送数据时加上延时试试
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7568
金钱
7568
注册时间
2016-11-30
在线时间
643 小时
发表于 2018-9-28 10:48:17 | 显示全部楼层
中断只能接收一个字符啊,会循环覆盖的
回复

使用道具 举报

18

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-3-24
在线时间
5 小时
 楼主| 发表于 2018-9-28 11:00:56 | 显示全部楼层
本帖最后由 sfraim 于 2018-9-28 11:02 编辑
HXYDJ 发表于 2018-9-28 10:28
主程序里面发送数据时加上延时试试

我每秒要对外发送25次,已经加了间隔,再延迟就有问题了
回复

使用道具 举报

18

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-3-24
在线时间
5 小时
 楼主| 发表于 2018-9-28 11:01:23 | 显示全部楼层
lvkanger 发表于 2018-9-28 10:48
中断只能接收一个字符啊,会循环覆盖的

关键是中断不是总能触发,
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7568
金钱
7568
注册时间
2016-11-30
在线时间
643 小时
发表于 2018-9-28 12:31:08 | 显示全部楼层
sfraim 发表于 2018-9-28 11:01
关键是中断不是总能触发,

提高波特率试一下呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 06:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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