高级会员

- 积分
- 649
- 金钱
- 649
- 注册时间
- 2015-11-7
- 在线时间
- 192 小时
|

楼主 |
发表于 2016-1-31 15:11:49
|
显示全部楼层
#include "stm32f10x.h"
#include "delay.h"
#include "timer.h"
#include "usart.h"
#include "oled.h"
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
OLED_Init();
OLED_Clear();
My_TIM1_Init(50-1, 720-1);
while(1);
}
#include "stm32f10x.h"
#include "timer.h"
#include "delay.h"
#include "usart.h"
#include "oled.h"
volatile u32 num = 0;
u32 value1 = 0, value2 = 0;
void My_TIM1_Init(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); /*开启TIM1端口完全重映射*/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStruct);
TIM_TimeBaseInitStruct.TIM_Period = arr;
TIM_TimeBaseInitStruct.TIM_Prescaler = psc;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 4; //实际脉冲个数加1
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_OCInitStruct.TIM_Pulse = arr/2;
TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Set; /*TIM1->CR2 输出空闲状态*/
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; /*输出使能*/
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; /*向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平 */
TIM_OC1Init(TIM1, &TIM_OCInitStruct);
NVIC_InitStruct.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStruct);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE); /*TIM1->BDTR |= 1<<15; MOE:主输出使能*/
TIM_SelectOnePulseMode(TIM1, TIM_OPMode_Single); /*打开单脉冲模式*/
TIM_Cmd(TIM1,ENABLE); /*失能计数器*/
}
void TIM1_UP_IRQHandler() //更新中断服务函数
{
if(TIM_GetITStatus(TIM1, TIM_IT_Update))
{
num++;
value1 = TIM1->RCR;
value2 = TIM1->CNT;
// OLED_ShowNum(12, 0, num, 2, 16);
// OLED_ShowNum(12, 2, value1, 2, 16);
// OLED_ShowNum(12, 4, value2, 2, 16);
if(num % 2 == 0)
{
TIM1->RCR = 7;
delay_ms(10);
TIM_Cmd(TIM1, ENABLE);
}
else
{
TIM1->RCR = 2;
delay_ms(10);
TIM_Cmd(TIM1, ENABLE);
}
}
TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除中断标志位
}
|
|