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 
			系统启动后的时钟配置单元(函数头文件声明)

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

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

Heap_Size       EQU     0x00000200
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

从地址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		;//代码段,只读模式

复位中断

; 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		

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

void Reset_Handler()
{
	SystemInit();
	main();
}		

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盘开机

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)	

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

void RCC_AHB1PeriphClockLPModeCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)	

复位 AHB1 总线上的外设时钟

void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)	

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;

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

设置某一个引脚为高电平

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

设置某一个引脚为低电平

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值