当前位置:   article > 正文

stm32开发及启动文件介绍_stm32主程序在哪个文件中打开

stm32主程序在哪个文件中打开

stm32
ST公司(意法半导体)
开发工具: keil—> 主要开发M0,M1,M4,使用std标准库开发
stm32cubmx—>主要开发M1,M4,M7,使用HAL硬件抽象库开发
stm32IDE ---->集成了所有的芯片,使用HAL和HLL硬件抽象库开发

stm32开发环境
ubuntu中开发
#include <stdio.h> —> stdio.h 在 /usr/include 文件夹下

在keil中搭建工程,也需要把对应的.h和.c库文件加入到环境变量中

Libraries:
----system_stm32f429_439xx.s:
官方提供的STM32F429和F439的启动文件。(用汇编语言写)

----inc : 存放所有STD外设标准库的头文件
----src :  存放所有STD外设标准库的源文件
----core_cm4.h core_cm4_simd.h :
			cotex-M4芯片对应的处理文件
----core_cmFunc.h core_cmInstr.h:
			所有stm32芯片的公用处理文件
----stm32f4xx.h
			中断向量表  + 寄存器操作函数 + 各个外设寄存器结构体
----system_stm32f4xx.h 
			系统启动后的时钟配置单元(函数头文件声明)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

User:
----main.c main.h
存放主程序位置
----stm32f4xx_conf.h
包含 inc 中的所有头文件
----stm32f4xx.h
包含部分中断函数的头文件
----system_stm32f4xx.c
系统启动后的时钟配置函数的位置

=====stm32的启动方式=
上电启动: 执行0x0地址,启动startup_stm32f429_439xx.s文件

申请0x400大小的栈空间,8字节对齐

Stack_Size      EQU     0x00000400
				AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
  • 1
  • 2
  • 3

申请0x200大小的堆空间,8字节对齐

Heap_Size       EQU     0x00000200
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
  • 1
  • 2
  • 3
  • 4
  • 5

从地址0开始的中断向量表:复位运行的只读的数据

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler				
				... .... 
				
				DCD     LTDC_ER_IRQHandler                ; LTDC error
                DCD     DMA2D_IRQHandler                  ; DMA2D
                                         
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY		;//代码段,只读模式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

复位中断

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]	;弱声明
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit			//指向 SystemInit 函数
                 BLX     R0							//执行 SystemInit 函数
                 LDR     R0, =__main				//指向 main 函数
                 BX      R0							//执行 main 函数
                 ENDP		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

[WEAK];弱声明—如果其他地方没有声明这个变量或函数,此处就作为该变量或函数的声明
否则按照其他地方的声明来初始化该变量或函数

void Reset_Handler()
{
	SystemInit();
	main();
}		
  • 1
  • 2
  • 3
  • 4
  • 5

stm32的正常启动流程: 从0x0地址开始运行,依次运行 __initial_sp ,Reset_Handler 在
Reset_Handler 函数中,先运行 SystemInit(),再运行 main()。从此跳转到主程序中运行。

扩展:
从0x0地址开始运行 ----- Reset_Handler
------跳转到 BootLoader ,初始化各个硬件模块(电源,内部总线等等)
------跳转到 uboot地址 , 初始化硬件模块的软件资源等等
------跳转到 linux内核地址 , linux中的调度,任务等软件资源
------跳转到 linux文件系统Fs, 运行环境脚本,产生linux文件系统的环境
此处的文件系统,也就是进程号1。所有后续的程序都是它的子进程。

stm32一共有3种启动方式:由 BOOT0和BOOT1来决定
			0表示低电平,1表示高电平,x表示高低点评都可以
			
	BOOT0==0 , BOOT1==x : 从主Flash启动(__main跳转到开发人员的main函数位置)	----从电脑C盘启动windows
	BOOT0==1 , BOOT1==0 :  从系统存储器启动(官方的自检代码)						----电脑开机进入安全模式
	BOOT0==1 , BOOT1==1 :  从SRAM启动(类似于flash的存储区)						----从电脑U盘开机
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

STM32程序烧录====
把stm32f429和串口线,STlink一起连接到电脑上。
安装烧写器STlink的驱动 dpinst_amd64.exe
安装HL340串口驱动 Hl-340.exe

=使用STD库开发==
在工程中,加入 stm32f4xx_gpio.c 和 stm32f4xx_rcc.c 文件

开启或者关闭 AHB1 总线上的外设时钟

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)	
  • 1

在低功耗模式下开启或者关闭 AHB1 总线上的外设时钟

void RCC_AHB1PeriphClockLPModeCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)	
  • 1

复位 AHB1 总线上的外设时钟

void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)	
  • 1

GPIO初始化函数

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

typedef struct
{
  uint32_t GPIO_Pin;          		//GPIO的引脚编号   GPIO_Pin_0 ~ GPIO_Pin_15
  
  GPIOMode_TypeDef GPIO_Mode;       //GPIO的模式
										GPIO_Mode_IN   //输入模式
										GPIO_Mode_OUT  //输出模式
										GPIO_Mode_AF   //复用模式
										GPIO_Mode_AN   //模拟模式
  
  GPIOSpeed_TypeDef GPIO_Speed;     //GPIO的速度
										GPIO_Low_Speed  //低速
										GPIO_Medium_Speed  //中速
										GPIO_Fast_Speed    //快速
										GPIO_High_Speed    //高速
													  
  GPIOOType_TypeDef GPIO_OType;     //GPIO输出模式下的输出类型
										GPIO_OType_PP   //推挽
										GPIO_OType_OD   //开漏
  
  GPIOPuPd_TypeDef GPIO_PuPd;       //上下拉电阻
										GPIO_PuPd_NOPULL  //无上下拉
										GPIO_PuPd_UP      //上拉
										GPIO_PuPd_DOWN    //下拉
}GPIO_InitTypeDef;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

STM32中,所有的外设都是以结构体的形式存在于库文件中的。
需要配置外设,其实就是配置一个结构体,然后让结构体作为初始化的参数

设置某一个引脚为高电平

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  • 1

设置某一个引脚为低电平

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/56681
推荐阅读
相关标签
  

闽ICP备14008679号