OpenEdv-开源电子网

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

STM32串口发送死循环,卡在while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);上了

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-7-30
在线时间
2 小时
发表于 2019-7-30 11:18:06 | 显示全部楼层 |阅读模式
2金钱
我最近做一个项目要用到多个串口,正好看了原子哥的视频,想用USART2通过定时器每隔一秒发送一个数组,但程序卡在while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);上了,同样的程序用USART1发送是可以的,不知道为啥用USART2就不行,我的用的是stm32f103RCT6,下面是主要程序

配置USART2的程序:
void my_usart2_init(u16 bound)
{
   GPIO_InitTypeDef gpioInitStruct;
USART_InitTypeDef usartInitStruct;
NVIC_InitTypeDef nvicInitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);


//PA2 TXD
gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
gpioInitStruct.GPIO_Pin = GPIO_Pin_2;
gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioInitStruct);

//PA3 RXD
gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
gpioInitStruct.GPIO_Pin = GPIO_Pin_3;
gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioInitStruct);

usartInitStruct.USART_BaudRate = bound;
usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控
usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   //接收和发送
usartInitStruct.USART_Parity = USART_Parity_No;     //无校验
usartInitStruct.USART_StopBits = USART_StopBits_1;    //1位停止位
usartInitStruct.USART_WordLength = USART_WordLength_8b;    //8位数据位
USART_Init(USART2, &usartInitStruct);

USART_Cmd(USART2, ENABLE);              //使能串口

USART_ClearFlag(USART2, USART_FLAG_TC);   

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);         //使能接收中断

nvicInitStruct.NVIC_IRQChannel = USART2_IRQn;
nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;
nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
nvicInitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&nvicInitStruct);
}

用串口发送数组的函数:
void Send_Order(USART_TypeDef * USARTx,u16 *s)
{

int i;
for(i=0;i<9;i++)
  {
   
     while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
   
   USART_SendData(USARTx,*(s+i));   
  
  }

}


TIM3中断服务函数
void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
  {
     TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
     
   LED1=!LED1;
   
   Send_Order(USART2,C);

  }
}



主函数
int main(void)

{


TIM3_Int_Init(9999,7199);//10Khz的计数频率
delay_init();       //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
my_usart2_init(9600);
  
LED_Init();      //初始化与LED连接的硬件接口

while(1)
{
  LED0=!LED0;
}  
}

希望大家能帮个忙,找了好久不知道错误在哪,现在挺着急的


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-7-30
在线时间
1 小时
发表于 2019-7-30 14:48:49 | 显示全部楼层
我用源程序串口1接收一直进接收中断,不执行主函数了
回复

使用道具 举报

1

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-4-24
在线时间
53 小时
发表于 2019-7-30 15:07:26 | 显示全部楼层
本帖最后由 qq819358001 于 2019-7-30 15:08 编辑

PA3配置成  GPIO_Mode_IN_FLOATING试试
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-7-30
在线时间
2 小时
 楼主| 发表于 2019-7-30 16:39:44 | 显示全部楼层
qq819358001 发表于 2019-7-30 15:07
PA3配置成  GPIO_Mode_IN_FLOATING试试

这个也试过了,不过还是一样
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-7-30
在线时间
7 小时
发表于 2019-7-30 17:42:47 | 显示全部楼层
你把发送和检测判断顺序调一下,先发送,在检测发送完成,试试
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-7-10
在线时间
7 小时
发表于 2019-7-31 14:38:23 | 显示全部楼层
你改一下复用功能的时钟,复用时钟UART1和UART2是不一样的,C:\Users\Administrator\Desktop\时钟.JPG
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-7-10
在线时间
7 小时
发表于 2019-7-31 14:48:46 | 显示全部楼层
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2| RCC_APB1Periph_AFIO, ENABLE);
这样改试试,我不知道怎么上传图片,具体信息可以查看时钟框图。
回复

使用道具 举报

0

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-7-24
在线时间
18 小时
发表于 2019-7-31 16:12:36 | 显示全部楼层
不应该全是复用推挽输出
回复

使用道具 举报

0

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-7-24
在线时间
18 小时
发表于 2019-7-31 16:15:55 | 显示全部楼层
输入不应该有速度
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-8-21
在线时间
18 小时
发表于 2019-8-18 15:38:33 | 显示全部楼层
楼主,问题是怎样解决的?
回复

使用道具 举报

4

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2019-7-28
在线时间
59 小时
发表于 2019-8-19 11:29:50 | 显示全部楼层
PA3肯定不能用_PP   !!!
回复

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-8-21 13:09:07 | 显示全部楼层
void Send_Order(USART_TypeDef * USARTx,u16 *s)
{

int i;
for(i=0;i<9;i++)
  {
   
     while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
   
   USART_SendData(USARTx,*(s+i));   
  
  }

}改成
void Send_Order(USART_TypeDef * USARTx,u16 *s)  {
int i;
for(i=0;i<9;i++) {

        USART_SendData(USARTx,*(s+i));   
    }
    while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
}
而且你要确保已经使能相应的中断了
PA3确实也应该改成浮空输入
世界和平
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2023-2-6
在线时间
2 小时
发表于 2024-1-16 16:11:27 | 显示全部楼层
发送中断没有使能
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 12:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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