#include "stm32f10x.h"
volatile unsigned int Timer2_Counter=0;
void init_port()
{
GPIO_InitTypeDef PORTA;
GPIO_InitTypeDef PORTB; //GPIO 구조체
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 클럭수를 배당
PORTA.GPIO_Pin=GPIO_Pin_0; //핀
PORTA.GPIO_Mode=GPIO_Mode_AF_PP;// 모드
PORTA.GPIO_Speed=GPIO_Speed_10MHz;//속도
GPIO_Init(GPIOA,&PORTA); //GPIOA를 PORTA로 초기화 한다.
PORTB.GPIO_Pin=GPIO_Pin_0; //핀
PORTB.GPIO_Mode=GPIO_Mode_AF_PP;// 모드
PORTB.GPIO_Speed=GPIO_Speed_10MHz;//속도
GPIO_Init(GPIOB,&PORTB); //GPIOA를 PORTA로 초기화 한다.
}
void TIM2_IRQHandler(void) //핸들러 함수에서 TIM_GetITStatus(TIM2,TIM_IT_Update)를 통해서 인터럽트 플래그가 set 되어있는지 확인하고 내가 만든 변수 증가한다.
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // Clear the interrupt flag
Timer2_Counter++; //카운트를 증가시킨다.
GPIOB->BRR = GPIO_Pin_0; // PB0 OFF
}
if(TIM_GetITStatus(TIM2,TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);//인터럽트 플래그를 지운다.
GPIOB->BSRR = GPIO_Pin_0; // PB0 ON
}
}
void init_Timer2()
{
NVIC_InitTypeDef NVIC_InitStructure;// 타이머 인터럽트 컨드롤
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//타이머
TIM_OCInitTypeDef OutputChannel;
/* TIM2 Clock Enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//클럭 할당
/* Enable TIM2 Global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);//NVIC 초기화
/* TIM2 Initialize */
TIM_TimeBaseStructure.TIM_Period=100-1; // 100kHz// 주기
TIM_TimeBaseStructure.TIM_Prescaler=24-1; //
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//타임 초기화
/* TIM2 PWM Initialize */
OutputChannel.TIM_OCMode = TIM_OCMode_PWM1;
OutputChannel.TIM_OutputState=TIM_OutputState_Enable;
OutputChannel.TIM_OutputNState=TIM_OutputNState_Enable;
OutputChannel.TIM_Pulse=50-1; // 50% duty ratio
OutputChannel.TIM_OCPolarity=TIM_OCPolarity_Low;
OutputChannel.TIM_OCNPolarity=TIM_OCNPolarity_High;
OutputChannel.TIM_OCIdleState=TIM_OCIdleState_Set;
OutputChannel.TIM_OCNIdleState=TIM_OCIdleState_Reset;
TIM_OC1Init(TIM2,&OutputChannel);//오실리스코프 초기화
/* TIM2 Enale */
TIM_Cmd(TIM2,ENABLE); //타이머가 가득차면 인터럽트 발생
TIM_ITConfig(TIM2,TIM_IT_Update | TIM_IT_CC1 ,ENABLE); // interrupt enable
}
void make_pwn(u16 val)
{
TIM_OCInitTypeDef OutputChannel; //오실리스코프 구조체 할당
OutputChannel.TIM_OCMode = TIM_OCMode_PWM1;
OutputChannel.TIM_OutputState=TIM_OutputState_Enable;
OutputChannel.TIM_OutputNState=TIM_OutputNState_Enable;
OutputChannel.TIM_Pulse=val;// 펄스값이 들어옴 val
OutputChannel.TIM_OCPolarity=TIM_OCPolarity_Low;
OutputChannel.TIM_OCNPolarity=TIM_OCNPolarity_High;
OutputChannel.TIM_OCIdleState=TIM_OCIdleState_Set;
OutputChannel.TIM_OCNIdleState=TIM_OCIdleState_Reset;
TIM_OC1Init(TIM2,&OutputChannel);// 구조체 할당
}
void delay(unsigned int del) //del 100이므로
{
Timer2_Counter=0; //전역 변수 초기화
while(Timer2_Counter<del); //100까지 반복 아마 타이머로인해 카운터가 수시로 증가됨.
}
int main()
{
u16 i;
SystemInit(); //시스템 초기화
init_port(); //출력 포트 초기화
init_Timer2(); //타이머 초기화 아마 출력포트에 영향
while(1)
{
for(i=0;i<100;i++)
{
TIM2->CCR1=i; //튜티비는 TIM_CCR / TIM_ARR 으로 제어 ccr 증가
delay(100); //딜레이
}
for(i=98;i>0;i--)
{
TIM2->CCR1=i;
delay(100);
}
}
}
댓글 없음:
댓글 쓰기