基于高性能Arm Cortex-M7 32位RISC内核,工作频率高达480 MHz.集成了高速嵌入式存储器和高达2 MB的双组闪存、高达1 MB的RAM(包括192 KB的TCM RAM、高达864 KB的用户SRAM和4 KB的备份SRAM),以及连接到APB总线的各种增强型I/O和外设, AHB 总线、2x32 位多 AHB 总线矩阵和支持内部和外部存储器访问的多层 AXI 互连。所有器件均提供三个ADC、两个DAC、两个超低功耗比较器、一个低功耗RTC、一个高分辨率定时器、12个通用16位定时器、两个用于电机控制的PWM定时器、<>个低功耗定时器和一个真随机数发生器(RNG)。这些器件支持四个用于外部Σ-Δ调制器(DFSDM)的数字滤波器。它们还具有标准和高级通信接口。
比如我们想得到不同定时器的主频,通过上面的框图,可以方便地获得如下信息:
SYSCLK(Hz) = 400000000 (CPU Clock)
HCLK(Hz) = 200000000 (AXI and AHBs Clock)
AHB Prescaler = 2
D1 APB3 Prescaler = 2 (APB3 Clock 100MHz)
D2 APB1 Prescaler = 2 (APB1 Clock 100MHz)
D2 APB2 Prescaler = 2 (APB2 Clock 100MHz)
D3 APB4 Prescaler = 2 (APB4 Clock 100MHz)
因为 APB1 prescaler != 1, 所以 APB1 上的 TIMxCLK = APB1 x 2 = 200MHz;
因为 APB2 prescaler != 1, 所以 APB2 上的 TIMxCLK = APB2 x 2 = 200MHz;
APB4 上面的 TIMxCLK 没有分频,所以就是 100MHz;
APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1
APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17
APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5
![](https://img-blog.csdnimg.cn/e1e164d81e004d84a547079917bfe69c.png)
对后期的dma的外设和寄存器之间的访问有重大作用。
c语言的复习:(基础不好的小伙伴可以再次的看看,回顾回顾,复习复习啊)
推荐一本书:C Primer Plus(第六版)
全局变量和局部变量:
在函数内部定义的变量是局部变量,而在函数之外定义的变量称为外部变量,也就是全局变量。
在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使 用它们,在此函数以外是不能使用这些变量的,这称为局部变量。
程序设计中,建议不要创建太多的全局变量,主要是出于以下三点考虑:
◆
全局变量在程序的执行过程中都占用存储单元,而不是仅在需要时才占用存储单元。
◆
函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。如果将一个函数移植到另一个
文件中,还要将有关的外部变量及其值一起移植过去。
◆
使用全局变量过多,会降低程序的清晰性,特别是多个函数都调用此变量时。
用 static 声明一个变量的作用:
◆
对局部变量用 static 声明,则使用该变量在整个程序执行期间不释放,为其分配的的空间始终存在。
◆
全局变量用 static 声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。
栈(stack)空间,用于局部变量,函数调时现场保护和返回地址,函数的形参等。
堆(heap)空间,主要用于动态内存分配,也就是说用 malloc,calloc, realloc 等函数分配的变量空间是
在堆上。以 STM32H7 为例,堆栈是在 startup_stm32h743xx.s 文件里面设置:
MAP文件:(几个名词的解释)
◆
Code (inc. Data) :显示代码占用了多少字节。
◆ RO Data :显示只读数据占用了多少字节。
◆
RW Data :显示读写数据占用了多少字节。
◆
ZI Data :显示零初始化的数据占用了多少字节。
◆
Debug :显示调试数据占用了多少字节,
HTM文件的分析:
MDK 将工程全编译,且没有错误后,就会生成此文件。以开发板配套例子为例,htm 文件位于路径:
\Project\MDK-ARM(uV5)\Objects。
此文件的最大作用就是基本统计了所有被调用函数的栈 stack 使用情况(不考虑中断嵌套)。