13_v 2025-01-18 11:11 采纳率: 0%
浏览 12

stm32f407vet6FLASH引导程序

问题:我写的串口IAP,然后我想在板子上实验一下要生成BIN文件的更新程序的效果,但是发现程序进不了主函数,无法执行LED灯亮的语句,如果使用定时器也是一样无法实现LED灯亮。板子是F407VET6,灯是正常初始化显示灯灭。

int main(void)
{ 
    Delay_Init();              //初始化延时函数
    Led_Init();                //初始化LED
    //Tim3_Init();            //初始化定时器
    
    SCB->VTOR = FLASH_BASE | 0x10000;//设置偏移量
  
    printf("进入主函数\r\n"); 
    while(1)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_6);
        GPIO_SetBits(GPIOA, GPIO_Pin_7);
    }
}


#include "tim.h"


/**********************************
定时器说明:
TIM3 -- APB1 -- 频率:84MHZ
TIM3 16定时器(65535)
***********************************/
void Tim3_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    NVIC_InitTypeDef           NVIC_InitStructure;
    //1、能定时器时钟。
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    
//    TIM_TimeBaseInitStruct.TIM_Prescaler    = (84-1);   //84分频 84MHZ/84 = 1MHZ
//    TIM_TimeBaseInitStruct.TIM_Period       = (1000-1); //1000个数,在1MHZ下,用时1ms
//    TIM_TimeBaseInitStruct.TIM_CounterMode  = TIM_CounterMode_Up; //向上计数
//    TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1; //分频因子
//    //2、初始化定时器,配置ARR,PSC。
//    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
    
    TIM_TimeBaseInitStruct.TIM_Prescaler    = (8400-1);   //8400分频 84MHZ/8400 = 10000HZ(1秒可数1000个数)
    TIM_TimeBaseInitStruct.TIM_Period       = (10000-1);  //10000个数,在10000HZ下,用时1s
    TIM_TimeBaseInitStruct.TIM_CounterMode  = TIM_CounterMode_Up; //向上计数
    TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1; //分频因子
    //2、初始化定时器,配置ARR,PSC。
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);   
    
    NVIC_InitStructure.NVIC_IRQChannel                   = TIM3_IRQn; //中断通道在stm32f4xx.h文件中查找
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 1; //响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;//通道使能
    //3、启定时器中断,配置NVIC。
    NVIC_Init(&NVIC_InitStructure);    
    
    
    //4、设置 TIM3_DIER  允许更新中断
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    
    //5、使能定时器。
    TIM_Cmd(TIM3, ENABLE);

}


void TIM3_IRQHandler(void)
{
    
    //判断标志位是否置1
    if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET )
    {
        
        GPIO_SetBits(GPIOA, GPIO_Pin_6);
        GPIO_SetBits(GPIOA, GPIO_Pin_7);

        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
    }    
    
    
}





  • 写回答

3条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    当你使用STM32F407VET6进行Flash引导程序(通常称为IAP,即In-Application Programming)时,确实可能会遇到一些挑战和配置细节。根据你提供的信息,你的程序似乎无法正常进入主函数并控制LED灯。以下是一些建议和步骤,帮助你解决问题:

    1. 确认硬件连接:确保所有硬件连接都是正确的,特别是与LED灯的连接。确保LED的电源供应没有问题,并且正确地连接到了STM32的GPIO端口上。
    2. 调试模式设置:在使用IAP时,需要确保你的STM32处于正确的启动模式(如用户启动模式)。STM32F4系列的启动模式可以通过BOOT引脚配置或通过编程FLASH选项字节来设置。确保你的设置是正确的。
    3. IAP配置:检查你的IAP引导程序的实现是否正确。特别是检查FLASH读取和编程过程是否准确无误。错误的引导过程可能会导致程序无法正常加载到主函数中。
    4. 二进制文件格式:确认你使用的BIN文件是否正确生成并且与目标微控制器兼容。不同开发工具和不同型号可能有不同的BIN文件格式要求。
    5. 调试输出:在你的代码中添加调试输出(如通过串口发送日志),这样即使不能控制LED灯亮起,也可以通过调试输出来了解程序的执行状态。这有助于确定程序是否成功加载并运行到预期的位置。
    6. 查看中断和异常处理:如果你的程序在执行某些关键操作时因异常中断而跳出主流程(例如未处理的异常),则可能不会执行预期的LED操作。确保妥善处理所有可能的中断和异常,特别是那些可能与串行通信相关的中断。
    7. 代码审查:仔细检查你的代码逻辑,确保没有任何可能导致早期终止或跳转的错误逻辑。有时候问题可能只是代码中的一个小错误或遗漏。
    8. 固件版本和工具链兼容性:确保你使用的固件库和开发工具链是最新的,并且与STM32F407VET6兼容。有时候旧版本的固件或工具链可能会导致不可预测的行为。
    9. 硬件问题排查:考虑是否真的可能是硬件问题。确保板子没有其他硬件问题(如短路或其他物理损坏)。尝试使用其他已知工作的板子和芯片来验证你的程序是否有问题。

    如果以上步骤都无法解决问题,建议详细记录你所遇到的问题和所做的尝试,并寻求来自开发者社区或制造商的技术支持帮助。在论坛上提供足够的信息(如代码片段、配置细节等),这样其他开发者可能能提供更具体的建议或解决方案。

    评论

报告相同问题?

问题事件

  • 修改了问题 1月18日
  • 创建了问题 1月18日