OpenEdv-开源电子网

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

输入捕获实验,串口没有显示wake_up按键按下的时间

[复制链接]

40

主题

137

帖子

0

精华

高级会员

Rank: 4

积分
579
金钱
579
注册时间
2019-8-4
在线时间
187 小时
发表于 2019-10-21 07:50:43 | 显示全部楼层 |阅读模式
4金钱
捕获程序如下#include "timer.h"
#include "led.h"
#include "usart.h"
void TIM5_Cap_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);

       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;        
       GPIO_Init(GPIOA,&GPIO_InitStructure);
       GPIO_setBits(GPIOA,GPIO_Pin_0);//按键下拉输入
        
        NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitStructure);

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_Period=arr;
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
        
        TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
        TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
        TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         
        TIM_ICInitStructure.TIM_ICFilter=0x00;
        TIM_ICInit(TIM5,&TIM_ICInitStructure);
        
        TIM_Cmd(TIM5,ENABLE);
        TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
}
   u8 TIM5_STA=0;//第七位为1完成高电平捕获,即按键按下的时间,第六位为0,按键刚刚按下,低5为为定时器溢出的次数
        u16 TIM5_VAL=0;//高电平计时

void TIM5_IRQHandler()
{
        
        if((TIM5_STA&0x80)==0)//还未捕获高电平
        {                         printf("liuxiaoke");//此语句用来测试程序是否能产生定时器更新中断

                if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
                {        
                        
                        if(TIM5_STA&0x40)//按键已经按下
                        {
                                if((TIM5_STA&0x3F)==0x3F)
                                {
                                        TIM5_STA|=0x80;
                                        TIM5_VAL=0XFFFF;
                                }else TIM5_STA++;
                        }
                }
                if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=RESET)
                {
                       printf("QQQ")//此语句用来测试程序是否能产生定时器捕获中断


                           if(TIM5_STA&0x40)
                        {
                                TIM5_STA|=0x80;
                                TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);
                                TIM5_VAL=TIM_GetCapture1(TIM5);
                        }
                        else
                        {

                                TIM5_STA=0;
                                TIM5_VAL=0;
                                TIM5_STA|=0x40;
                                TIM_SetCounter(TIM5,0);
                                TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);//按键刚刚按下,改为下降沿捕获
                        }
                }
        }
        TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1);
}
主函数如下

extern u8  TIM5_STA;                //输入捕获状态
extern u16 TIM5_VAL;        //输入捕获值
int main(void)
{
    u32 temp=0;
    delay_init();                     //延时函数初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);         //串口初始化为115200

    TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数 ,arr=2^16=65536
    while(1)
    {
        delay_ms(10);
        if(TIM5_STA&0X80)//成功捕获到了一次上升沿
        {
            temp=TIM5_STA&0X3F;
            temp*=65536;//溢出时间总和
            temp=(temp+TIM5_VAL)/1000000;//得到总的高电平时间
            printf("HIGH:%d s\r\n",temp);//打印总的高点平时间
            TIM5_STA=0;//开启下一次捕获
        }
    }
}

没有任何实验现象,其他的程序比如串口发送都是例程给的,我就仿写了主程序和捕获程序,对照一样,就是不行,按键按下,发现程序无法进入捕获中断

最佳答案

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

是建立工程出错了,代码粘贴到另外一个工程就好了,但是我不知道工程错在哪里
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

40

主题

137

帖子

0

精华

高级会员

Rank: 4

积分
579
金钱
579
注册时间
2019-8-4
在线时间
187 小时
 楼主| 发表于 2019-10-21 07:50:44 | 显示全部楼层
是建立工程出错了,代码粘贴到另外一个工程就好了,但是我不知道工程错在哪里
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10570
金钱
10570
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-10-21 10:40:02 | 显示全部楼层
原子的板子?
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
922
金钱
922
注册时间
2018-7-18
在线时间
385 小时
发表于 2019-10-21 12:47:08 | 显示全部楼层
你把GPIO设置为输入模式    然后又写了句GPIO_SetBits(GPIOA,GPIO_Pin_0); 是什么意思?
回复

使用道具 举报

40

主题

137

帖子

0

精华

高级会员

Rank: 4

积分
579
金钱
579
注册时间
2019-8-4
在线时间
187 小时
 楼主| 发表于 2019-10-23 07:45:43 | 显示全部楼层
注释掉了也不行
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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