OpenEdv-开源电子网

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

串口输入实验循环中不能进if问题

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-5-1
在线时间
4 小时
发表于 2021-5-7 19:29:45 | 显示全部楼层 |阅读模式
2金钱
stm32f407zg
我仿照a盘的串口输入实验样例做了一个程序,发现主函数的循环体内无法进入条件。
尝试调试,调试之后程序能够进入中断,但是就是进入不了if里面

主函数
  1. int main(void)
  2. {
  3.         int recive;
  4.        
  5.         //初始化延时
  6.         delay_init(168);
  7.        
  8.         //初始化系统
  9.         GPIO_mode();
  10.         USART_mode();
  11.         USART1_interrupt_mode();
  12.        
  13.         while(1)
  14.         {
  15.                 printf("please input some words\r\n");
  16.                
  17.                 //接收数据结束后进入分支
  18.                 if((USART_RX_STA&0x8000)!=0)
  19.                 {
  20.                         int i;
  21.                        
  22.                         //获取接受字长
  23.                         recive=(USART_RX_STA&0x3FFF);
  24.                         //
  25.                         printf("\r\n");
  26.                         printf("you've input:");
  27.                        
  28.                         for(i=0; i<recive; i++)
  29.                         {
  30.                                 USART_SendData(USART1, USART_RX_BUF[i]);
  31.                         }
  32.                         printf("\r\n");
  33.                        
  34.                         //复位
  35.                         USART_RX_STA=0;
  36.                 }               
  37.                 delay_ms(1000);
  38.         }
  39. }
复制代码



以下是初始化外设和中断的函数,但我觉得问题可能不会在这里面
  1. void GPIO_mode(void)
  2. {
  3.         //定义GPIO初始化结构体
  4.         GPIO_InitTypeDef PA9;
  5.         GPIO_InitTypeDef PA10;
  6.        
  7.         //打开GPIO时钟
  8.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  9.        
  10.         //初始化PA9
  11.         PA9.GPIO_Mode=GPIO_Mode_AF;
  12.         PA9.GPIO_OType=GPIO_OType_PP;
  13.         PA9.GPIO_Pin=GPIO_Pin_9;
  14.         PA9.GPIO_PuPd=GPIO_PuPd_UP;
  15.         PA9.GPIO_Speed=GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOA,&PA9);
  17.        
  18.         //初始化PA10
  19.         PA10.GPIO_Mode=GPIO_Mode_AF;
  20.         PA10.GPIO_OType=GPIO_OType_PP;
  21.         PA10.GPIO_Pin=GPIO_Pin_9;
  22.         PA10.GPIO_PuPd=GPIO_PuPd_UP;
  23.         PA10.GPIO_Speed=GPIO_Speed_50MHz;
  24.         GPIO_Init(GPIOA,&PA10);
  25.        
  26.         //将引脚复用
  27.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
  28.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
  29. }

  30. void USART_mode(void)
  31. {
  32.         //定义USART1初始化结构体
  33.         USART_InitTypeDef Usart1_content1;
  34.        
  35.         //打开USART1时钟
  36.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  37.                
  38.         //初始化USART1
  39.         Usart1_content1.USART_BaudRate=115200;
  40.         Usart1_content1.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  41.         Usart1_content1.USART_Mode=USART_Mode_RTx;
  42.         Usart1_content1.USART_Parity=USART_Parity_No;
  43.         Usart1_content1.USART_StopBits=USART_StopBits_1;
  44.         Usart1_content1.USART_WordLength=USART_WordLength_8b;
  45.         USART_Init(USART1,&Usart1_content1);
  46.        
  47.         //打开USART1
  48.         USART_Cmd(USART1,ENABLE);
  49.        
  50.         //接驳中断
  51.         USART_ITConfig(USART1,USART_IT_PE,ENABLE);
  52. }

  53. void USART1_interrupt_mode(void)
  54. {
  55.         //定义中断初始化结构体
  56.         NVIC_InitTypeDef USART1_Interrupt_content;
  57.        
  58.         //中断分组
  59.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  60.        
  61.         //初始化USART1中断
  62.         USART1_Interrupt_content.NVIC_IRQChannel=USART1_IRQn;
  63.         USART1_Interrupt_content.NVIC_IRQChannelCmd=ENABLE;
  64.         USART1_Interrupt_content.NVIC_IRQChannelPreemptionPriority=0;
  65.         USART1_Interrupt_content.NVIC_IRQChannelSubPriority=0;
  66.         NVIC_Init(&USART1_Interrupt_content);
  67. }
复制代码


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

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8465
金钱
8465
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-5-8 11:50:37 | 显示全部楼层
USART_ITConfig(USART1,USART_IT_PE,ENABLE);
这似乎不是开启接收中断啊,确认是收到数据了吗?
看下中断服务函数,收到的数据立即发回看对不对。
专治疑难杂症
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-5-1
在线时间
4 小时
 楼主| 发表于 2021-5-8 17:27:41 | 显示全部楼层
本帖最后由 BBCC 于 2021-5-8 19:19 编辑
LcwSwust 发表于 2021-5-8 11:50
USART_ITConfig(USART1,USART_IT_PE,ENABLE);
这似乎不是开启接收中断啊,确认是收到数据了吗?
看下中 ...

改成RXNE之后
我自己又调试了一下,发现是DR寄存器接受不了数据·····
keil里面DR的值一直是0
中断服务函数里面是原子给的
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-5-8 21:56:26 | 显示全部楼层
打断点调试中断程序,看是不是正常进中断。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 00:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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