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等等
posted @ 2019-10-14 22:07  回归的世界线  阅读(754)  评论(0编辑  收藏  举报