OpenEdv-开源电子网

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

我想把进入中断的GPIO口改了

[复制链接]

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
发表于 2016-7-26 23:24:48 | 显示全部楼层 |阅读模式
1金钱
GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
源程序如下,由于pA.0口已经定义了,我想改了IO口从GPIO_Pin_0改但是不行啊

最佳答案

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

你让我惊呆了,你这是捕获中断。我还以为是外部中断呢。 捕获中断不能随意换io口,只有带有TIMx_CHx才可以当捕获中断引脚,你用的TIM3需要找 TIM3_CHx的引脚
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-26 23:24:49 | 显示全部楼层
尼卡 发表于 2016-7-27 11:21
void Timer3_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;

你让我惊呆了,你这是捕获中断。我还以为是外部中断呢。
捕获中断不能随意换io口,只有带有TIMx_CHx才可以当捕获中断引脚,你用的TIM3需要找
TIM3_CHx的引脚
回复

使用道具 举报

13

主题

611

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1929
金钱
1929
注册时间
2014-10-6
在线时间
625 小时
发表于 2016-7-27 07:21:42 | 显示全部楼层
GPIO口的中断线配置和中断函数也要相应的修改!
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 08:19:50 | 显示全部楼层
烟酒不沾 发表于 2016-7-27 07:21
GPIO口的中断线配置和中断函数也要相应的修改!

怎么配置啊,具体在那个函数?改了半天似乎都没有改到点上
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 10:15:34 | 显示全部楼层
烟酒不沾 发表于 2016-7-27 07:21
GPIO口的中断线配置和中断函数也要相应的修改!

中断函数内部就是cnt作比较,应该不用换吧,配置上我换过中断函数,但是也不行啊 ,看仿真运行过程不知道哪里经过原来的引脚了
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 10:35:50 | 显示全部楼层
配置IO口初始化,然后配置中断线对应的io口,开中断。中断函数
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 11:21:55 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 10:35
配置IO口初始化,然后配置中断线对应的io口,开中断。中断函数

void Timer3_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
  
   
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        TIM_DeInit(TIM3);
        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler =psc;                   
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
        TIM_SetCounter(TIM3, 0);                                       
        TIM_Cmd(TIM3, ENABLE);
                                                         
}
这是程序,我用它做外部计数器测频率,应该是初始化了的
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 12:29:43 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 10:35
配置IO口初始化,然后配置中断线对应的io口,开中断。中断函数

我看到有些IO口可以了,但是我换成那些IO口也检测不出来啊,比如TIM3——CH1是PA6引脚控制的,我换成Pin6也不行啊
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 12:40:43 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 10:35
配置IO口初始化,然后配置中断线对应的io口,开中断。中断函数

还有我看到原来的引脚有配置etr的,是不是我还要找一个有etr功能的引脚啊
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 13:48:14 | 显示全部楼层
尼卡 发表于 2016-7-27 12:29
我看到有些IO口可以了,但是我换成那些IO口也检测不出来啊,比如TIM3——CH1是PA6引脚控制的,我换成Pin6 ...

代码贴上来,你应该是配置错了。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
要配置复用
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 13:55:49 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 13:48
代码贴上来,你应该是配置错了。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
要配置复用

void Timer3_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
  
   
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        TIM_DeInit(TIM3);
        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler =psc;                  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
        TIM_SetCounter(TIM3, 0);                                       
        TIM_Cmd(TIM3, ENABLE);
                                                         
}
u16 getspeed()
        {
        u16 deta;
        count0=count1;
        delay_ms(50);                                         //deta t=50ms
        count1=TIM3->CNT;
        if(count1<count0)                               
        {
        deta=0xffff-count0+count1;
        }
        else
        deta=count1-count0;
        return deta;
        }
int main(void)
{
        SystemInit();                          
        delay_init(72);                              
        uart_init(9600);
        NVIC_Configuration();          
        Timer3_Init(0xffff,0);
     
       
                while(1)
        {
                speed=getspeed();       
                 printf("%d\r\n",speed*17);
                  
                }
}
这就是程序了,但是测频率好像不太准,但是还能测到,我只是改了time。c的文件,库我看过但是没改过,另外配置复用那么我另外一个脚和这个定义是一样的脚,都是捕获脉冲,会冲突吗

回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 14:26:13 | 显示全部楼层
PA6你同时用捕获和干别的了么
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 14:31:17 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 14:26
PA6你同时用捕获和干别的了么

其实是A0,我想用两种方法测频率,一种捕获,一种外部计数,但是移植的程序全定义在一个口,我还改不了
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 14:32:46 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 14:26
PA6你同时用捕获和干别的了么

在这个程序里没有另外的那个定义,但是我移植过一次有问题我就先解决这个的IO扣的问题再去移植
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 15:53:09 | 显示全部楼层
尼卡 发表于 2016-7-27 14:32
在这个程序里没有另外的那个定义,但是我移植过一次有问题我就先解决这个的IO扣的问题再去移植


你以前是不是看青风电子的051或者030的教程。
你的代码里面,我没看到你定时器捕获的初始化。而且你计算出来的deta的值有什么作用??????这是一个毫无意义的值
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 15:59:39 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 15:53
你以前是不是看青风电子的051或者030的教程。
你的代码里面,我没看到你定时器捕获的初始化。而且你计 ...

那个deta是执行函数的返回值,用来显示出频率的,
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 16:11:17 | 显示全部楼层
尼卡 发表于 2016-7-27 15:59
那个deta是执行函数的返回值,用来显示出频率的,

呵呵,他怎么显示频率了,他每次间隔的时间很大可能是不一样的
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 16:12:34 | 显示全部楼层
莫非你以为他计时的是50ms???
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 16:18:49 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 16:12
莫非你以为他计时的是50ms???

恩,真实情况也是这样,他确实需要乘以个倍数才能得到一个近似频率,而且这么做很依赖delay延时,但是我确实写不出更精确的测量手段,以前想的是用输入捕获加分频的,但是精度更低,很小的频率就失真了,
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 16:20:28 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 15:53
你以前是不是看青风电子的051或者030的教程。
你的代码里面,我没看到你定时器捕获的初始化。而且你计 ...

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        TIM_DeInit(TIM3);
        TIM_TimeBaseStructure.TIM_Period = arr;
        TIM_TimeBaseStructure.TIM_Prescaler =psc;                  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
还有这段是不是初始化啊,我在主函数对arr,psc定义了
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 16:24:25 | 显示全部楼层
尼卡 发表于 2016-7-27 16:18
恩,真实情况也是这样,他确实需要乘以个倍数才能得到一个近似频率,而且这么做很依赖delay延时,但是我 ...

printf("%d\r\n",speed*17);你以为这一句不需要时间么。。。。。你这一句的时间不是固定的。
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 16:27:06 | 显示全部楼层
如果是通过上下升边沿计算频率的话,直接开定时器捕获就行了
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 16:27:31 | 显示全部楼层
你以前是不是看过青风电子的051或者030的教程。
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 16:35:56 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 16:27
你以前是不是看过青风电子的051或者030的教程。

恩,我对51还是蛮擅长的,其实要不是32测量脉宽有优势的话用51做也是可以的,还有我测量出上升沿时间和下降沿时间加起来就能算出频率,但是这样在高频的情况下很不准确
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 16:38:07 | 显示全部楼层
尼卡 发表于 2016-7-27 16:35
恩,我对51还是蛮擅长的,其实要不是32测量脉宽有优势的话用51做也是可以的,还有我测量出上升沿时间和下 ...

高频有多高,高到一定程度的话,32也是不行的
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 16:45:37 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 16:38
高频有多高,高到一定程度的话,32也是不行的

2mhz,还是可以用32完成的   在网上看了一些资料
但是网上资料一般不太准确而且有些坑
这个程序勉强能到2M但是我移植不到主函数里面啊
而且这个程序频率不是实际值,所以要改很多次
还有这个为什么换不了别的口的中断啊,我从昨天看到今天,都想放弃这程序了
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-27 16:56:04 | 显示全部楼层
得用定时器的外部计算模式,再利用另外一个定时器记录时间,然后计算频率
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-26
在线时间
0 小时
 楼主| 发表于 2016-7-27 17:05:32 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-27 16:56
得用定时器的外部计算模式,再利用另外一个定时器记录时间,然后计算频率

有点小明白了,谢谢啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 11:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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