STM32 C++编程 001 工程模板
将 STM32的官方工程模板 修改为我们这套教材的:STM32 C++工程模板
我使用的 STM32 库的版本 : V3.5.0
注意:
想学习本套 STM32 C++编程 的专栏是有点门槛的。你需要有一点点 STM32 基础 和 一点点 C++ 语言基础。
完整的STM32 C++工程模板 的下载地址可以在本篇博客的最下面找到。
下面是:将 STM32的官方工程模板 修改为我们这套教材的 STM32 C++工程模板 的修改步骤:
1. 在启动文件中,增大了 堆 和 栈 的空间
原启动文件里堆栈的大小:
增大后:
- 栈:
编译器自动分配释放。比如说:函数语句的调用(存放函数的参数值,局部变量的值等等)、指针。
- 堆:
一般由程序员分配释放。由关键字new分配的内存,即对象,存放在堆 中。
Q: 为什么要增大启动文件中 堆 和 栈 的空间?
A: 解释:
对于C++语言,相比C语言,它有对象的说法。如果你定义的一个对象需要分配的动态内存空间超出了STM32 启动文件里面设定的堆栈的大小,程序编译的时候是没有错误的,并且也可以烧到板子里面。但是在执行的时候没就出现错误,如果你在线调试程序,你会发现:程序死在了 stm32f10x_it.cpp 文件里的HardFault_Handler()中断函数里面出不来。
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
出现这种问题一般都是:数组越界,堆栈溢出所导致的,就是内存空间分配的问题。根据你的实际情况,解决办法就是:
- 增大数组的容量;增大启动文件中堆栈的大小。
- 对于我们使用C++变成,如果你不将STM32的启动文件中堆栈的大小调大一点,当程序使用了比较都的对象时,就会很容易死在
HardFault_Handler()函数里面。
2. 将一些.c文件扩展名改为:.cpp
将原模板工程里面的main.c 和 stm32f10x_it.c的后缀名改为:.cpp。
修改后为:main.cpp 和 stm32f10x_it.cpp。
3. 在stm32f10x_it.cpp 文件中添加一些兼容C/C++的代码:
添加下面的声明:
#define ARMAPI extern "C"
这个声明是:在.cpp文件中,使用这个声明(ARMAPI)声明的函数,会被用 C语言 对待。
在用户可以使用的中断函数前面添加关键字:ARMAPI。比如:
ARMAPI void USART1_IRQHandler(void)
{
}
4. 我已经将一个Gpio类添加到了这个STM32 C++模板程序 里面。
Gpio类 下节再讲。
搞定
你可以到这里下载我已经做好的 STM32 C++工程模板:
百度云 链接:http://pan.baidu.com/s/1bpbZ2MV 密码:esam
也可以在CSDN里面下载:http://download.csdn.net/detail/github_35160620/9621141
小结:
下一讲,我们来使用C++语言,创建一个STM32的Gpio类。
STM32 C++编程 001 工程模板的更多相关文章
- STM32 C++编程 002 GPIO类
使用 C++ 语言给 STM32 编写一个 Gpio 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专 ...
- STM32 C++编程 005 I2c(Soft)类
使用 C++ 语言给 STM32 编写一个 I2c(Soft)类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编 ...
- STM32 C++编程 004 Adc (数模转换)类
使用 C++ 语言给 STM32 编写一个 Adc 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专栏 ...
- STM32 C++编程 003 USART(串口)类
使用 C++ 语言给 STM32 编写一个 Usart 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的 ...
- STM32库函数编程、Keli/MDK、stm32f103zet6
catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...
- STM32学习笔记——新建工程模板步骤(向原子哥学习)
1. 在创建工程之前,先在电脑的某个目录下面建立一个文件夹,我们先把它命名为Template,后面建立的工程可以放在这个文件夹下.在 Template 工程目录下面,新建 3 个文件夹USER , ...
- STM32系列之新建工程模板(三)
今天,我将记录STM32如何新建一个模板步骤 第一步:首先先新建一个文件夹(英文命名的)——作为工程根目录 第二步;在文件夹中新建一个名为USER的子目录文件 第三步:点击 MDK 的菜单:Proje ...
- STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...
- STM32 可编程电压监测器(PVD)实现数据掉电保存
STM32内部有一个完整的上电复位和掉电复位电路,当供电电压达到2v时系统即能正常工作. STM32内部自带PVD功能,用于对MCU供电电压VDD进行监控.通过电源控制寄存器中的PLS[2:0]位可以 ...
随机推荐
- MongoDB 高可用集群搭建(3.4)
一.架构概况192.168.56.101192.168.56.102192.168.56.103OS为centos 7.2 架构图: 规划5个组件对应的端口号,由于每台机器均需要同时部署 mong ...
- LeetCode OJ:Contains Duplicate III(是否包含重复)
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- jsp中向浏览器页面输出的方式总结
jsp中百分号内输出 不需要有JavaScript标签 1.因为jsp就是包含在html 里面,所以什么都不干时,就是在body里面输出html内容 2.百分号 内是JavaScript代码?java ...
- New Concept English three (48)
23w/m 76errors In this much-travelled world, there are still thousands of places which are inaccessi ...
- spring学习-5
spring表达式SpEL 语法#{..},为bean的属性进行动态赋值 通过bean的id对bean进行引用 调用方法以及引用对象中的属性 计算表达式的值 正则表达式的匹配 修改Address.ja ...
- Codeforces Round #286 (Div. 2)A. Mr. Kitayuta's Gift(暴力,string的应用)
由于字符串的长度很短,所以就暴力枚举每一个空每一个字母,出现行的就输出.这么简单的思路我居然没想到,临场想了很多,以为有什么技巧,越想越迷...是思维方式有问题,遇到问题先分析最简单粗暴的办法,然后一 ...
- CANopenSocket CANopenCGI.c hacking
/**************************************************************************************** * CANopenS ...
- poj2374 Fence Obstacle Course[线段树+DP]
https://vjudge.net/problem/POJ-2374 吐槽.在这题上面磕了许久..英文不好题面读错了qwq,写了个错的算法搞了很久..A掉之后瞥了一眼众多julao题解,**,怎么想 ...
- poj 1201 Intervals——差分约束裸题
题目:http://poj.org/problem?id=1201 差分约束裸套路:前缀和 本题可以不把源点向每个点连一条0的边,可以直接把0点作为源点.这样会快许多! 可能是因为 i-1 向 i 都 ...
- BZOJ1999 树网的核[数据加强版]
1999: [Noip2007]Core树网的核 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1214 Solved: 336[Submit][St ...