OpenEdv-开源电子网

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

请问高级定时器TIM1重复计数器的使用效果是不是不能用keil的软件仿真器仿真出来

[复制链接]

8

主题

47

帖子

0

精华

高级会员

Rank: 4

积分
649
金钱
649
注册时间
2015-11-7
在线时间
192 小时
发表于 2016-1-31 15:11:48 | 显示全部楼层 |阅读模式
5金钱
把程序烧在板子上绿灯亮的时间持续40多秒,而软件仿真时一个低电平时间才500ms,说明软件仿真时计数器每有一次溢出,都会产生一个更新事件,和重复计数器存的值貌似没有关系。我的理解不知道对不对。
int main()
{       
        LED_Init();
        delay_init();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
        My_TIM1_Init(5000,7199);
        LED1 = 0;       
        while(1)
        {                       
//          TIM_Cmd(TIM1,ENABLE);
        }
}


void My_TIM1_Init(u16 arr,u16 psc)  //TIM1_CH4 PA11
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;
        GPIO_InitTypeDef GPIO_InitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;
        //时钟使能
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA,ENABLE);       
       
        //PA11端口初始化
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStruct);
       
        //时基单元初始化
        TIM_TimeBaseInitStruct.TIM_Period = arr;
        TIM_TimeBaseInitStruct.TIM_Prescaler = psc;
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 100; //产生101个脉冲后才产生更新事件
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);
       
        //开启更新中断       
        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);       
       
        //输出比较通道4初始化
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;  //有效电平为高
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //输出使能
        TIM_OCInitStruct.TIM_Pulse = 500;        //设置CCR4比较值
        TIM_OC4Init(TIM1,&TIM_OCInitStruct);       
       
        //使能预装载寄存器,保证数据更新同步
        TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);       
        TIM_ARRPreloadConfig(TIM1,ENABLE);
       
        //中断控制器初始化
        NVIC_InitStruct.NVIC_IRQChannel = TIM1_UP_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
        NVIC_Init(&NVIC_InitStruct);
       
        TIM_CtrlPWMOutputs(TIM1,ENABLE);        //使能主输出       
        TIM_Cmd(TIM1,ENABLE); //使能TIM1的计数器
}

void TIM1_UP_IRQHandler() //更新中断服务函数
{
        if(TIM_GetITStatus(TIM1,TIM_IT_Update) == SET)
        {
//                TIM_Cmd(TIM1,DISABLE);
//                delay_ms(200);               
//                TIM_Cmd(TIM1,ENABLE);
                LED1 = ~LED1;
        }
        TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除中断标志位
}


软件仿真图

软件仿真图

最佳答案

查看完整内容[请看2#楼]

#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 value ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

47

帖子

0

精华

高级会员

Rank: 4

积分
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); //清除中断标志位       
}


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 07:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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