OpenEdv-开源电子网

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

STM32生成固定数量的脉冲信号,为什么进不了中断

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-11-29
在线时间
7 小时
发表于 2018-10-10 18:17:01 | 显示全部楼层 |阅读模式
本帖最后由 feng330724 于 2018-10-10 18:19 编辑

void Interrupt_Priority(u8 channel,u8 grab,u8 respon,INT_Group_Type group)
{
   
    NVIC->IP[channel]=((grab<<(4-group))|respon)<<4;              
    NVIC->ISER[0]|=1<<channel;
}

/*左上电机的脉冲控制程序,PA0控制转动,PB5控制转向*/
void TIM_Left1_Init()
{
    RCC->APB2ENR|=(1<<2)|(1<<0);//使能AFIO、GPIOA时钟
    GPIOA->CRL&=0xfffffff0;
    GPIOA->CRL|=0x0000000a;         //配置PORTA.0为复用推挽输出,输出最大频率2MHz
   
    RCC->APB1ENR|=1;            //使能定时器TIMER2时钟
    TIM2->PSC=64-1;                  //设置定时器2预分频值,使定时器得到1MHz的计数频率
    TIM2->CR1|=1<<2;              //设置只有计数溢出作为更新中断
    TIM2->DIER|=1<<0;              //允许定时器2计数溢出中断
   
    Interrupt_Priority(28,0,2,group_2);  //使能第28号中断(即定时器2全局中断),抢占0响应2,中断分组2
   
    TIM2->CCMR1&=~(3<<0);         //CC1通道配置为输出模式
    TIM2->CCMR1|=7<<4;            //输出比较1为PWM模式2
    TIM2->CCER|=1<<0;              //通道1输出使能
   
}

void TIM_Left1_Startup(u16 frequency)       //启动定时器2
{
    if(frequency<20)  frequency=20;      //最小频率设定为20,因为频率设定过小,得到的重装值会超出16位
    TIM2->ARR=1000000/frequency-1;  //设定重装值
    TIM2->CCR1=TIM2->ARR>>1;   //匹配值1等于重装值一半,是以占空比为50%
    delay_ms(10);                      //脉冲信号比方向信号滞后,以提高可靠性
    TIM2->CR1|=1<<0;              //启动定时器TIMER2计数
}

void DRVI_Left1(long num,u16 frequency)        //相对定位函数
{
    if(num>0)
    {
        GPIOB->BSRR=1<<5;
    }
    else if(num<0)
    {
        GPIOB->BRR=1<<5;
    }
    mubiao_Left1=dangqian_Left1+num;

    TIM_Left1_Startup(frequency);
}

void DRVA_Left1(long num,u16 frequency)         //绝对定位函数
{
    mubiao_Left1=num;
    if(mubiao_Left1==dangqian_Left1)
    {
        run_Left1=OFF;
    }
    else
    {
        if(mubiao_Left1>dangqian_Left1)
        {
            GPIOB->BSRR=1<<5;
        }
        else
        {
            GPIOB->BRR=1<<5;
        }
        TIM_Left1_Startup(frequency);
    }
}



void TIM2_IRQHandler()                    //定时器2全局中断函数
{
    if(TIM2->SR&0x0001)
    {
        if(GPIOB->ODR&(1<<5))         //如果方向为正   
        {
            dangqian_Left1++;
        }
        else                              //否则方向为负
        {
            dangqian_Left1--;
        }
        if(dangqian_Left1==mubiao_Left1)              //计数溢出次数、也即输出的脉冲个数达到目标值
        {
            TIM2->CR1&=~(1<<0);      //停止定时器2计数、也即停止脉冲输出
            run_Left1=OFF;                      //复位脉冲定位指令执行标志
        }
        TIM2->SR=0x0000;
    }
}

int main()
{
    mubiao_Left1=0;//目标位置脉冲值
    dangqian_Left1=0;//当前位置脉冲值
    run_Left1=OFF;//脉冲定位指令执行标志
   
    RCC->APB2ENR|=(1<<3);//使能GPIOB时钟
   
    GPIOB->CRL&=0xff0fffff;
    GPIOB->CRL|=0x00300000;//GPIOB.5配置为推挽输出,作为左上脉冲的方向信号输出
    GPIOB->BRR=1<<5;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    TIM_Left1_Init();
   
    DRVI_Left1(-200,200);//前进20脉冲
    while(1)
    {
        
    }

}

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 14:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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