STM32 开发板资源梳理
片内资源
开发板使用的STM32F407ZGT6在手册里是这样的:
片内FLASH:1M,片内RAM:192K,这两个跟程序运行和下载密切相关。
FLASH
地址分配如图,因此FLASH下载地址从0x8000 0000
开始,大小为0x0010 0000
(1M)
RAM
RAM的两段需要注意的是只有0x20000000
开始的112K+16K+64K是可以让外设访问的,而0x10000000
开始的64K不可被外设访问
时钟与总线
系统时钟SYS_CLK
有3个来源,HSI(内部16M,可用作PLL),HSE(外部高速,晶振产生),PLL(主PLL由HSE或HSI提供,输出两路,第一个输出高速系统时钟168M,第二路生成USBOTG 48M、RNG<=48M、SDIO时钟<=48M,专用PLL用于I2S),配置方面可以参考cubeMX来设置
总线的概念一直不太清楚,这里总线部分引用自网络:
总线来自于ARM公司的AMBA标准,是ARM公司提出的一种开放性的SoC总线标准,现在已经广泛的应用于RISC的内核上,它定义了两种总线: AHB(Advanced High-performance Bus)先进的高性能总线,也叫做ASB(Advanced System Bus)。APB(Advanced peripheral Bus)先进的外设总线,AHB和ASB其实是一个东西,是高速总线,主要负责嵌入式处理器、DMA控制器、Memory等等的接口。 APB是低速总线,主要负责外设接口
简单说就是高低速分离,通过bridge连接,片上外设配置的寄存器涉及的总线在手册中有写:
中断
中断类型和资源手册有写,这里标记下如何在程序中使用中断,首先在工程中一般是CORE目录下会有startup_stm32f40_41xxx.s
这个汇编文件,摘取其中一部分说明:
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000800 ;如果使用STemWin的话此值应该设置大一点
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; 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 HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window WatchDog
DCD PVD_IRQHandler ; PVD through EXTI Line detection
DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_IRQHandler ; EXTI Line2
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
这里定义了栈Stack_Size
和堆Heap_Size
的大小,栈内存放局部变量和程序嵌套过程中的压栈数据,堆可用于动态内存分配和释放,注意全局变量在BSS段不占用栈和堆,__Vectors
给出了中断向量表和服务函数的名称,在C文件中定义相应的服务函数即可:
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) //溢出中断
{
//OS_TimeMS++;
printf("frame:%d\r\n", ov_frame); //打印帧率
//printf("jpeg_data_len:%d\r\n",jpeg_data_len);//打印帧率
ov_frame = 0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除中断标志位
}
其他
参考手册使用
板载资源
- W25Q128 128Mbit的SPIflash,实际16MB可用
- AT24C02 2048bit,256B的E2PROM,IIC接口
- 液晶屏,网口DP83848,RS485/232,CAN,SRAM,USBOTG等等