scut_altn 2024-02-21 19:51 采纳率: 33.3%
浏览 20
已结题

proteus stm32 定时器仿真

peoteus仿真stm32定时器功能,想实现Num的值过一秒增加一次

但实际仿真的时候,一加上定时器初始化函数,lcd12864亮但是不显示内容,注释掉定时器初始化函数,正常显示,
我想问一下,这是因为什么原因呢?

注释掉定时器初始化函数时的运行结果

img

加上定时器初始化函数时的运行结果

img

主函数

#include "stm32f10x.h"                  // Device header
#include "LCD12864.h"
#include "Timer.h"

unsigned int Num;

int main() 
{
        
    LCD_GPIO_Configration();
    LCD12864_Init();
    
   Timer_Init();
    

    LCD_Position(4,1);
    LCD_Show_String("hello word");//
    
 while(1)
 {
         LCD_Position(1,1);
      LCD_Show_Num(Num,5);//
 }
 
}

void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    {
        Num++;
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}


#include "stm32f10x.h"                  // Device header


void Timer_Init(void)
{
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    
    
    
    //ʱÖÓʹÄÜ
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    
    TIM_InternalClockConfig(TIM2);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
    //¶¨Ê±Æ÷Timer2³õʼ»¯
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1 ;
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period=7200-1;
    TIM_TimeBaseInitStructure.TIM_Prescaler=10000-1;
//    TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;

    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);

    //ʹÄÜÖ¸¶¨µÄTIM2Öжϣ¬ÔÊÐí¸üÐÂÖжÏ
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    
    //ÖжÏÓÅÏȼ¶NVICÉèÖÃ
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    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);

  //ʹÄÜTIM2
    TIM_Cmd(TIM2,ENABLE);
    
}









  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-02-21 19:53
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    根据你的描述,出现LCD不显示内容的问题很可能是由于定时器初始化函数对系统时钟或者GPIO口的配置造成了冲突。在初始化定时器的过程中,可能改变了某些与LCD控制相关的配置,导致LCD无法正常工作。

    为了解决这个问题,你可以尝试以下几个方面的调整:

    1. 检查定时器初始化代码:仔细检查定时器初始化函数中的代码,确保它不会影响与LCD相关的配置。特别关注定时器所用到的GPIO口,确保没有与LCD使用的GPIO口冲突。

    2. 调整定时器初始化顺序:尝试将定时器的初始化放在LCD初始化之前进行,这样可以确保LCD的配置不会被定时器的初始化所影响。

    3. 查看定时器中断处理函数:确认定时器中断处理函数是否正确地增加了Num变量的值,并且及时清除了中断标志位。

    4. 排查定时器配置问题:检查定时器的时钟源、分频系数等配置是否正确,确保定时器能够按照预期的频率工作。

    5. 使用调试工具:如果以上方法都无法解决问题,可以尝试使用调试工具如Keil或者ST-Link来逐步调试程序,查看在定时器初始化之后系统的状态变化,以及定时器中断是否正常触发。

    根据你提供的代码,我会在下面给出一个可能的修改方案,你可以尝试将定时器的初始化放在LCD初始化之前进行:

    #include "stm32f10x.h"
    #include "LCD12864.h"
    #include "Timer.h"
    
    unsigned int Num;
    
    int main() {
        LCD_GPIO_Configration();
        Timer_Init(); // 将定时器初始化放在LCD初始化之前
        LCD12864_Init();
        
        LCD_Position(4,1);
        LCD_Show_String("hello word");
    
        while(1) {
            LCD_Position(1,1);
            LCD_Show_Num(Num,5);
        }
    }
    
    void TIM2_IRQHandler(void) {
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) {
            Num++;
            TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        }
    }
    
    void Timer_Init(void) {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        
        TIM_InternalClockConfig(TIM2);
        
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_Period = 7200 - 1;
        TIM_TimeBaseInitStructure.TIM_Prescaler = 10000 - 1;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
        
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        
        NVIC_InitTypeDef NVIC_InitStructure;
        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);
        
        TIM_Cmd(TIM2, ENABLE);
    }
    

    以上是一个可能的解决方案,尝试按照这个方案修改代码,看看是否能够解决你遇到的问题。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月22日
  • 创建了问题 2月21日

悬赏问题

  • ¥15 FPGA芯片60进制计数器
  • ¥15 前端js怎么实现word的.doc后缀文件在线预览
  • ¥20 macmin m 4连接iPad
  • ¥15 DBIF_REPO_SQL_ERROR
  • ¥15 根据历年月数据,用Stata预测未来六个月汇率
  • ¥15 DevEco studio开发工具 真机联调找不到手机设备
  • ¥15 请教前后端分离的问题
  • ¥100 冷钱包突然失效,急寻解决方案
  • ¥15 下载honeyd时报错 configure: error: you need to instal a more recent version of libdnet
  • ¥15 距离软磁铁一定距离的磁感应强度大小怎么求