硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3706|回复: 5
收起左侧

新手刚接触ST芯片,请问F429启动PC指到0x0000 0000,不能到main()

[复制链接]

3

主题

9

回帖

3

积分

新手上路

积分
3
发表于 2016-7-1 11:19:41 | 显示全部楼层 |阅读模式
新建工程,自动导入F429启动文件“startup_stm32f429_439xx.s”,然后自己新建一个C文件里面添加SystemInit()函数,另外创建main.c文件里面为main()函数,但是用Dug调试启动发现PC指针并没有跳转到main函数入口而是指向了地址0x0000 0000 处,请问各位这是什么问题,该怎么解决
系统时钟配置如下代码,HSE外部晶振为8MHz



void SystemInit(void){   
    system_clock_init();
}

static void system_clock_init(void){   
       RCC->CR |=1;                                            
       RCC->CFGR = 0x00000000;                                       
       RCC->CR &= 0xFEF6FFFF;                                   
       RCC-&gtLLCFGR = 0x24003010;                                      
       RCC->CR &= 0xFFFBFFFF;                                   
       RCC->CIR = 0x00000000;                                       
       SetSysClock();
}


static void SetSysClock(void){    unsigned int HSEStatus = 0;
    unsigned int PLL_M=8;   
    unsigned int PLL_N=336;
    unsigned int PLL_P=2;   
    unsigned int PLL_Q=7;

    RCC->CR |= 0x10000;                                          
    do{
        HSEStatus = RCC->CR & 0x20000;   
     }while(HSEStatus == 0);        

    RCC->APB1ENR |= 0x10000000;                                 
    PWR->CR |= 0x0000C000;                                    
    RCC->CFGR |= 0x00000000;                                       
    RCC->CFGR |= 0x00008000;                                 
    RCC->CFGR |= 0x00001400;                                      
    RCC-&gtLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | (0x00400000) | (PLL_Q << 24);
    RCC->CR |= 0x01000000;                                         
    while((RCC->CR & 0x02000000) == 0);                       

    RCC->CFGR &= ~0x00000003;   
    RCC->CFGR |= 0x00000002;                                 
    while ((RCC->CFGR & 0x0000000C ) != 0x00000008);        

}

说明屏蔽红色字体的三行代码,就不会跑飞到地址0x0000 0000处了,哪位高人帮解答解答啊,苦恼啊
回复

使用道具 举报

3

主题

9

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2016-7-1 12:41:01 | 显示全部楼层
[s:128] [s:128] [s:128]
没人回复吗,自己顶一下,大家别看过就走啊,知道的说两句啊,帮帮忙啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2016-7-2 01:56:46 | 显示全部楼层
楼主,你怎么不用ST的标准库呢,自己寄存器方式创建的话,没有研究过。
回复

使用道具 举报

3

主题

9

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2016-8-5 08:57:50 | 显示全部楼层

回 eric2013 的帖子

eric2013:楼主,你怎么不用ST的标准库呢,自己寄存器方式创建的话,没有研究过。 (2016-07-02 01:56) 
我只是为了看起来直观一点,完全是按照ST标准库翻译过来的
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2016-8-5 18:11:09 | 显示全部楼层
00000000是复位中断向量ResetHandler地址,复位后首先指向0000 0000,从中取出Reset_Handler地址,然后跳转到Reset_Handler,在Reset_Handler中执行初始化工作,之后才进入main函数
其实这和大学计算机原理当中的8086复位过程如出一辙
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2016-8-5 18:24:27 | 显示全部楼层

回 yyx112358 的帖子

yyx112358:00000000是复位中断向量ResetHandler地址,复位后首先指向0000 0000,从中取出Reset_Handler地址,然后跳转到Reset_Handler,在Reset_Handler中执行初始化工作,之后才进入main函数
其实这和大学计算机原理当中的8086复位过程如出一辙
; Reset handler
Reset_Handler  & .. (2016-08-05 18:11) 
00000000是 SP栈指针
00000004是 复位中断复位程序地址。

因为重映射,将0x0800 0000开始的中断向量表映射到了首地址。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 09:33 , Processed in 0.172900 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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