推荐阅读
1、STM32CubeMX 简介说明STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,时间和费用。STM32CubeMX几乎覆盖了STM32 全系列芯片。它具有如下特性:1)直观的选择MCU 型号,可指定系列、封装、外设数量等条件;2)微控制器图形化配置;3)自动处理引脚冲突;4)动态设置时钟树,生成系统时钟配置代码;5)可以动态设置外围和中间件模式和初始化;6)功耗预测;7)C 代码工程生成器覆盖了STM32 微控制器初始化编译软件,如IAR, KEIL,GCC;8)可以独立使用或者作为Eclipse 插件使用
发表于 2019-04-01
1、Code即代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。2、RO-dataRead Only data,即只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。例如:C语言中const关键字定义的变量就是典型的RO-data。3、RW-dataRead Write data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如:C语言中使用定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。4、ZI-dataZero Initialie data,即0初始化数据
发表于 2019-04-01
本身的长度,比如int类型就能超过32位二进位。3)位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如: struct k { int a:1 int :2 /*该2位不能使用*/ int b:3 int c:2 }; 从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。  
发表于 2019-04-01
1、STM32 启动文件与 .sct 文件分析1) 定义STACK段,{NOINIT,读写}:分配一段内存大小为0.5K;2) 定义HEAP段, {NOINIT,读写}:分配一段内存大小为1K;3) 定义RESET段,{DATA,只读}:DCD各种中断向量;4) 定义|.text|段,{CODE,只读}:Reset_Handler函数,函数中最后加载了__main;对剩余的中断函数进行了弱定义;在最后还有一段用户初始化堆栈的代码__user_initial_stackheap。那这些代码都存放在什么位置呢?5) 分析 .sct 文件:分散加载文件(即scatter file,后缀为.scf)。分散加载文件是一个文本文件,通过编写
发表于 2019-04-01
了。startup.s 这个文件并没有所谓的"段拷贝"功能。对含有启动程序来说,"执行地址与加载地址相同"不容易实现:如果执行地址与加载地址相同哪当然不需要做"段拷贝",但是个人理解编译器还会加入"段拷贝"程序(如果用B __main 的话),只是因为条件不满足而不执行而已;但是对含有启动程序来说,"执行地址与加载地址相同"就不容易了.因为启动程序是要烧到非易失存储器里,用来在上电执行的,而这个程序必定会有RW段,如果RW放在非易失存储器,如FLASH,那就不好实现RW功能了,因此要给RW移动到能够实现RW功能的存储器,如SRAM
发表于 2019-04-01
__main就好了;c),虽然通过读标准的CMSIS汇编启动代码也可以知道堆栈是怎样初始化的。以LPC54608为例,早期的芯片会有不同的处理方式,比如大家都很熟悉的STM32F103系列,是需要启动代码与分散加载配合完成的。3.1、异常&中断向量表之前我们说这个可以用数组来实现,普通数组肯定不行,因为这些向量的本质是中断服务函数的入口,也就是“函数指针”所以这个数组必须得是函数指针数组:所以我们先声明一个函数指针类型:typedef void ( *__vector )( void );然后定义一个函数指针型数组取名为__vector_table:__vector __vector_table[] = {};  
发表于 2019-04-01