• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

stm32f10x 输出比较打开后程序卡死在下个函数

Gwvfbukn 2018-09-28 浏览量:1301

输出比较有脉冲输出,卡死在初始化后面的函数,注释后后面函数正常


会是哪里问题?


定时器配置问题吗?


GPIO_InitTypeDef GPIO_Structure;
TIM_TimebaseInitTypeDef  TIM_TimebaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

//开定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 ENABLE);
//配置pwm输出管脚
GPIO_Structure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_6;
GPIO_Structure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA &GPIO_Structure);
GPIO_SetBits(GPIOAGPIO_Pin_1 | GPIO_Pin_6); //初始化引脚
//配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //中断源
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断通道使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_Init(&NVIC_InitStructure); //初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //中断源
NVIC_Init(&NVIC_InitStructure); //初始化

// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断  即周期
TIM_TimebaseStructure.TIM_Period = 1000 - 1; //周期
TIM_TimebaseStructure.TIM_Prescaler= 360-1;// 时钟预分频数
TIM_TimebaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割 0
TIM_TimebaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimebaseStructure.TIM_RepetitionCounter = 0; //高级定时器选项,普通定时器忽略即可

TIM_TimebaseInit(TIM2 &TIM_TimebaseStructure);// 初始化定时器
TIM_TimebaseInit(TIM3 &TIM_TimebaseStructure);// 初始化定时器
//初始化定时器通道:
  TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Toggle; //翻转输出模式
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //状态使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

TIM_OC2Init(TIM2&TIM_OCInitStructure); //输出比较通道2初始化
TIM_OC1Init(TIM3&TIM_OCInitStructure); //输出比较通道1初始化

TIM_OC2PreloadConfig(TIM2 TIM_OCPreload_Disable);
TIM_OC1PreloadConfig(TIM3 TIM_OCPreload_Disable); //失能预装载寄存器

TIM_ITConfig(TIM2TIM_IT_CC2ENABLE);
TIM_Cmd(TIM2 ENABLE);
TIM_ITConfig(TIM3TIM_IT_CC1ENABLE);
TIM_Cmd(TIM3 ENABLE);

TIM_CtrlPWMOutputs(TIM2 ENABLE);
TIM_CtrlPWMOutputs(TIM3 ENABLE);


中断函数:

void TIM2_IRQHandler(void)   //PA1
{
if(TIM_GetITStatus(TIM2TIM_IT_CC2) == SET)
{
TIM_ClearITPendingBit(TIM2TIM_IT_CC2);
i ++;
if(i == 2)
{
i = 0;
TIM2->ARR=1000;
TIM_SetCompare2(TIM250);  
}
}

}

void TIM3_IRQHandler(void) //PA6
{
if(TIM_GetITStatus(TIM3TIM_IT_CC1) == SET)
{
TIM_ClearITPendingBit(TIM2TIM_IT_CC1);
i ++;
if(i == 2)
{
i = 0;
TIM3->ARR=3000; //设置重装载值  改变这个可以改变频率
TIM_SetCompare1(TIM320);  //设置比较值

}
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 一般卡死就是,要么是中断配置不对,要么就是时钟配置的不对。建议你先一步一步来,调通一个外设再进行下一步。一次全弄上就不知所措了。
    • 发布于 2018-09-29
    • 举报
    • 评论 1
    • 0
    • 0
Gwvfbukn 回复了 奔跑的黑蚂蚁:哦哦,多谢指点 回复

其他答案 数量:11
  • 一个是时钟,一个是中断配置,仔细检查一下
    • 发布于2018-10-04
    • 举报
    • 评论 0
    • 1
    • 0

  • 你可以打印一下你的代码信息,看你的代码到底卡死在哪个的代码
    • 发布于2018-10-11
    • 举报
    • 评论 0
    • 1
    • 0

  • 这样说不好判断,最好把这部分代码贴出来
    • 发布于2018-09-28
    • 举报
    • 评论 2
    • 0
    • 0
Gwvfbukn 回复了 捷波 :贴出来了,,有时间麻烦看下。。stm32小白 回复
Gwvfbukn 回复了 捷波 :就上面初始化过后,下面就卡死了 回复

  • 应该是时钟配置的时候卡死了,楼主可以先调通串口外设,再用printf单步调试卡死的地方。

    • 发布于2018-09-28
    • 举报
    • 评论 1
    • 0
    • 0
Gwvfbukn 回复了 donatello :嗯,慢慢检查下吧。 回复

Gwvfbukn 回复了 longrenwenzi :嗯,我试试 回复

  • 应该是中断的配置不对,跑到了硬件错误中断中了
    • 发布于2018-09-29
    • 举报
    • 评论 1
    • 0
    • 0
Gwvfbukn 回复了 人民吃瓜 :嗯,就是中断问题,粗心导致的,,有个标志没清。。 回复

  • 检查一下你的中断标志位还有对应的中断使能是否打开
    • 发布于2018-09-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 你是移植过来的吗?可以看下原子例程或者移植他的
    • 发布于2018-10-01
    • 举报
    • 评论 1
    • 0
    • 0
Gwvfbukn 回复了 yhj416606438 :csdn复制了一部分代码改的 回复

  • 这种最好在调试模式下面一步步打断点,看卡死在哪个函数了
    • 发布于2018-10-04
    • 举报
    • 评论 0
    • 0
    • 0

  • 最好是在调试状态下单步执行,如果没有调试器,可以使用串口输出信息的方式查找哪里出现问题。
    • 发布于2018-10-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 你可以打印一下卡死的地方再进行调试找到原因
    • 发布于2018-11-11
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

stm32f10x 输出比较打开后程序卡死在下个函数