打算利用TIM3_CH1通道輸出方波,然后宣告一個全域變數steps,在TIM3的中斷里面對steps進行自減計數,以實作TIM3_CH1只發出指定steps個數的脈沖。
其中PC6->led7(正常TIM3_CH1連接的埠),
PC1->led2(中斷函式里面控制的埠),
PC0->led1(main函式里面控制的埠)(已經在led.h中定義好了,包括位帶操作)
但是在除錯時候發現,led7會一直閃爍,但是不會停止。表明實際無法沒有進入中斷。
但是一個詭異的現象是,當我加進下面注釋的那一段回圈代碼之后,就全都正常了,
led1、led2、led7全都正常閃爍,led2在閃爍5次后停止,led7在閃爍10次后停止,完全正常。只是led1并沒有按照預期的閃爍5次就停止。實在是無法知道這個是什么原因?請大神們指點一二。
代碼如下:
#include "system.h"
#include "SysTick.h"
extern u16 steps;
int main()
{
/* int i = 5; */
SysTick_Init(72);
LED_Init();
Move(10);
/* while(i)
{
led1 = 0;
delay_ms(200);
led1 = 1;
delay_ms(200);
i--;
} */
}
以下是定時器配置函式
#include "StepperDriverTIM3.h"
u16 steps; //全域變數,以記錄脈沖數。在中斷函式里面進行自減
int led2Status = 0; //記錄led2的當前狀態
void Move(u16 num)
{
NVIC_InitTypeDef NVIC_InitStructure;
steps = num;
TIM3_CH1_PWM_Init(2000-1, 7200*5-1);
TIM_SetCompare1(TIM3, 1500);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM3_CH1_PWM_Init(u16 per,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseInitStructure.TIM_Period=per;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = per/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3,ENABLE);
TIM_Cmd(TIM3,ENABLE);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
{
steps--;
led2=led2Status;
led2Status = 1- led2Status;
if(!steps)
{
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
TIM_Cmd(TIM3,DISABLE);
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
#ifndef _led_H
#define _led_H
#include "system.h"
#define LED_PORT GPIOC
#define LED_PIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
#define LED_PORT_RCC RCC_APB2Periph_GPIOC
#define led1 PCout(0)
#define led2 PCout(1)
#define led3 PCout(2)
void LED_Init(void);
uj5u.com熱心網友回復:
補充下,用的STM32F103ZET6的板子,會不會是我的埠被什么占用了呢?但是按道理沒有打開埠復用時鐘,是不是就不會存在占用問題呢?uj5u.com熱心網友回復:
已找到原因,main函式里面忘了搞個死回圈,來等待中斷產生。uj5u.com熱心網友回復:
想看多個定時器同時作業的狀態定義標識,我的干到一起了,標志也是轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/130752.html
標籤:單片機/工控
