OpenEdv-开源电子网

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

我用按键外部中断控制stm32向外发送数据,每按一下发送10个字节数据,开始时候串口和按键没有冲突,

[复制链接]

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
发表于 2023-6-25 14:49:26 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 Xiuer666 于 2023-6-25 14:56 编辑

按下按键能够发送数据,过了10s左右,按下按键串口突然没反应了,外部中断不能触发了,这有可能是什么问题导致的呢?除了优先级问题,还有其他的什么原因吗



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

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-6-26 09:08:52 | 显示全部楼层
肯定是代码有问题,但是没看到代码。
专治疑难杂症
回复

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12692
金钱
12692
注册时间
2012-11-26
在线时间
3711 小时
发表于 2023-6-26 10:05:43 | 显示全部楼层
程序估计死了吧,自己debug看下
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-6-26 11:26:11 | 显示全部楼层
LcwSwust 发表于 2023-6-26 09:08
肯定是代码有问题,但是没看到代码。

stm32串口pA9tx引脚可以在拉高拉低电平和发送数据状态下切换吗  就是我需要先用pa9引脚产生一个上升沿唤醒模组,然后在发送数据,这样能做到不?我初步试了一下,这样实现不了,不知道是不是我程序问题不,老哥这样做过不?
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-6-26 11:28:20 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-6-26 11:29 编辑
Xiuer666 发表于 2023-6-26 11:26
stm32串口pA9tx引脚可以在拉高拉低电平和发送数据状态下切换吗  就是我需要先用pa9引脚产生一个上升沿唤 ...

虽然我没这样做过,但理论上是可以的。
还有个办法就是你发一个数据不就有上升沿了吗?比如发送0x00,或0xFF。
专治疑难杂症
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-6-26 11:29:29 | 显示全部楼层
LcwSwust 发表于 2023-6-26 09:08
肯定是代码有问题,但是没看到代码。

void RST_Init2(void)
{
         GPIO_InitTypeDef  GPIO_InitStructure;         
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
         GPIO_Init(GPIOA, &GPIO_InitStructure);                                       
         GPIO_ResetBits(GPIOA,GPIO_Pin_9);                                                

}

void WAKE(void)                   //唤醒函数,用于唤醒模块
{
RST_Init2();
  GPIO_ResetBits (GPIOA, GPIO_Pin_9);        
delay_ms(5);
GPIO_SetBits (GPIOA, GPIO_Pin_9);
usart1_Init1(19200);
delay_ms(5);
}

                if(Send_data==1)  按键按下发送
                 {                        
                         Send_data=0;        
                  WAKE();
                  Start_Send_Uart_Data(11,TxBuffer);                 
                 }
        
         }
这个PA9tx引脚可以这样用吗
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-6-26 11:32:25 | 显示全部楼层
LcwSwust 发表于 2023-6-26 11:28
虽然我没这样做过,但理论上是可以的。
还有个办法就是你发一个数据不就有上升沿了吗?比如发送0x00,或 ...

是,我是做了一个发送字节数据的,但是接收方可能会出现乱码情况,所以我就想着能不能用PA9引脚 发高低电平的方式,就能避免出现乱码情况
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-6-26 11:33:50 | 显示全部楼层
Xiuer666 发表于 2023-6-26 11:29
void RST_Init2(void)
{
         GPIO_InitTypeDef  GPIO_InitStructure;         

可以这样用,但是要注意,我只看到你对PA9的模式改为GPIO_Mode_Out_PP,没看到GPIO_Mode_AF_PP。
专治疑难杂症
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-6-26 11:36:30 | 显示全部楼层
LcwSwust 发表于 2023-6-26 11:33
可以这样用,但是要注意,但我只看到你对PA9的模式改为GPIO_Mode_Out_PP,没看到GPIO_Mode_AF ...

GPIO_Mode_AF_PP。在usart1_Init1(19200);这个函数里面,就是串口初始化函数,我的想法就是切换完高低电平在切换为usart1_Init1(19200)GPIO_Mode_AF_PP,再发送数据
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-6-26 11:38:15 | 显示全部楼层
Xiuer666 发表于 2023-6-26 11:36
GPIO_Mode_AF_PP。在usart1_Init1(19200);这个函数里面,就是串口初始化函数,我的想法就是切换完高低电 ...

哦,那就没问题了。还有什么问题?
专治疑难杂症
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-6-26 12:29:20 | 显示全部楼层
LcwSwust 发表于 2023-6-26 11:38
哦,那就没问题了。还有什么问题?

剩下就是上面这个问题,我再调仿真仿真,不知道卡哪了,开始能运行,过一会就不行了
按下按键能够发送数据,过了10s左右,按下按键串口突然没反应了,外部中断不能触发了
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-6-26 13:14:01 | 显示全部楼层
Xiuer666 发表于 2023-6-26 12:29
剩下就是上面这个问题,我再调仿真仿真,不知道卡哪了,开始能运行,过一会就不行了
按下按键能够发送数 ...

先别用中断,在主函数里这样试一下:
  1. while(1)
  2. {
  3. WAKE();
  4. Start_Send_Uart_Data(11,TxBuffer);   
  5. delay_ms(1000);
  6. }
复制代码
专治疑难杂症
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-6-26 14:11:27 | 显示全部楼层
LcwSwust 发表于 2023-6-26 13:14
先别用中断,在主函数里这样试一下:

这样测了10多分钟 没问题  没卡住  
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-6-26 14:15:24 | 显示全部楼层
Xiuer666 发表于 2023-6-26 14:11
这样测了10多分钟 没问题  没卡住

哦,那就说明问题在于你没发出来的代码里。
专治疑难杂症
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-6-26 14:24:49 | 显示全部楼层
LcwSwust 发表于 2023-6-26 14:15
哦,那就说明问题在于你没发出来的代码里。

嗯  感谢老哥,我再调试调试 找找问题
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-6-26 17:19:35 | 显示全部楼层
LcwSwust 发表于 2023-6-26 14:15
哦,那就说明问题在于你没发出来的代码里。

void RST_Init2(void)
{
         GPIO_InitTypeDef  GPIO_InitStructure;        
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                               
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
         GPIO_Init(GPIOA, &GPIO_InitStructure);                                       
         GPIO_ResetBits(GPIOA,GPIO_Pin_9);                                               

}


void WAKE(void)                   //唤醒函数,用于唤醒模块
{
RST_Init2();
  GPIO_ResetBits (GPIOA, GPIO_Pin_9);        
delay_ms(5);
GPIO_SetBits (GPIOA, GPIO_Pin_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); //初始化PA.9
delay_ms(5);
}我这样改了一下能行。因为我只改了PA9引脚的输出方式,所以我只把PA9改为GPIO_Mode_AF_PP是不是就行了?
66.png
图片上的这些参数是不是就不用再初始化一遍了?因为我没改其他的参数

回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-6-26 17:23:58 | 显示全部楼层
Xiuer666 发表于 2023-6-26 17:19
void RST_Init2(void)
{
         GPIO_InitTypeDef  GPIO_InitStructure;        

只把PA9改为GPIO_Mode_AF_PP,对。
不用再初始化一遍,对。
这些其实你都可以自己尝试一下,没必要啥都问。
有空再研究下库函数的代码,对照手册看寄存器。
专治疑难杂症
回复

使用道具 举报

43

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1163
金钱
1163
注册时间
2019-10-22
在线时间
226 小时
 楼主| 发表于 2023-6-26 17:37:42 | 显示全部楼层
LcwSwust 发表于 2023-6-26 17:23
只把PA9改为GPIO_Mode_AF_PP,对。
不用再初始化一遍,对。
这些其实你都可以自己尝试一下,没必要啥都 ...

嗯嗯   谢谢老哥
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 06:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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