赞
踩
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)
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。