N32应用笔记1:keil新建工程,编译与烧录
本文目的
由于上层建筑要求,最近开始用起了N32(为什么要抛弃那么香的STM32我也不是很清楚),本文主要总结一下如何从0使用官方给的固件库实现一个N32的工程。
本文所用到的IDE是keil5.36,所使用的N32芯片为N32G452VEL7,window10平台下进行的工作
前置准备
- 下载好keil5.36(我用的5.36),keil基本会用
- N32G452VEL7的开发板或者最小系统板。
- C++基本语法基础
- 单片机基础知识
- 官方的固件库和资料文档(文末有下载链接)
N32简介
N32G452VEL7简介
N32G452 系列采用 32 bit ARM Cortex-M4 内核,最高工作主频 144MHz,支持浮点运算和 DSP 指令,集成高达 512KB 嵌入式 Flash,144KB SRAM,多个 U(S)ART、I2C、SPI、QSPI、USB、CAN 通信总线接口,集成 12bit ADC、DAC 等模拟接口 ,内置密码算法硬件加速引擎
我的印象
我所使用的N32G452VEL7简介
Nation国民技术(据说老板和我们老板认识所以采用的他家的),一开始以为非常垃圾,但是实际上发现官方能够给到相当不少的一个文档和demo,特别是常用的一些配置,还是可以的。
工程建立流程
懒得自己建的话可以从N32G452工程模板下载项目文件,同时里面加入了freertos的代码。
1 固件包下载和安装
在N32官方资料链接ftp://download.nationstech.com(ftp需要在文件资源管理器打开)中下载N32G452xx_V3.1.0压缩包解压
安装keil相关的DFP固件包,固件包在路径N32G452xx_V3.1.0\N32G452xx_V3.1.0\6-Software Development Kit下
2 新建工程文件的文件夹
- 新建一个文件夹,名称是项目名称,我这里写的是demo,可以改
- 在文件夹底下新建如下文件夹,可以看个人喜好建立,以下给出的是我写工程的一些习惯建法
其中firmware不是自己建立的,而是官方提供的固件库(理解为库函数吧)
把N32G452xx_V3.1.0\N32G452xx_V3.1.0\6-Software Development Kit\Nationstech.N32G45x_Library.2.2.0路径下的firmware全部挪过来就行。
我个人设置的文件结构如下
+---Application//用于存放应用层代码
| +---Inc
| \---Src
+---BSP//板级支持包,包括驱动,外设
| +---Device//外设
| | +---Inc
| | \---Src
| \---Driver//驱动
| +---Inc
| \---Src
+---firmware//官方提供的固件库部分代码,这个部分是从官方的SDK移植过来的
| +---CMSIS
| | +---core
| | \---device
| | \---startup
| +---n32g45x_algo_lib
| | +---inc
| | \---lib
| +---n32g45x_std_periph_driver
| | +---inc
| | \---src
| \---n32g45x_usbfs_driver
| +---inc
| \---src
+---Middleware//中间层,这部分我的理解是一些算法和对驱动进一步封装的一些模块
| +---Inc
| \---Src
\---Project//存放keil project
如果有rtos的话会选择另外开一个文件夹,这里先不考虑
3 keil MDK新建工程
- 看图操作就行
- 保存路径选择刚刚的Project文件夹
- 这里选择所使用的芯片N32G452VEL7,之前安装了固件包这里就能看到
- 弹出来的窗口直接ok不用管
- 项目建好长这个样子
- 添加项目里面的项目文件夹和项目
各个文件夹有什么用?
STARTUP存放启动文件,是官方提供的一个汇编
CMSIS存放系统文件,是官方提供的,涉及时钟等一些初始化的内容
FWLIB存放固件库,也是官方的东西
BSP/Driver 存放驱动,比如定时器配置,io口配置等等为上层提供服务
BSP/Device 存放设备代码,比如陀螺仪通信等等
Middleware 存放中间层,包括算法,模块进一步封装,一些调用设备进行数据处理和控制的代码
Application 存放main.cpp,一些应用层代码
如果使用了rtos最好再开一个rtos分组存放rtos文件,现在先不管
全部添加完是这个样子的
4 向工程分组添加必要的文件
4.1 添加启动文件
文件以及路径是 firmware\CMSIS\device\startup\startup_n32g45x.s
文件夹下其他两个是IAR和GCC的启动文件不要搞错了。
添加完是这样的
4.2 添加系统文件
文件以及路径是 firmware\CMSIS\device\system_n32g45x.c
添加完是这样的
4.3 固件库文件
文件夹路径是 firmware\n32g45x_std_periph_driver
这里只需要添加使用到的外设即可,当然也可以全部都添加喽,但是会导致工程比较大
我这里全部都加进去了,添加完是这样的
4.4 创建一个main函数
在Application/Src下建立main.cpp,同上一步一样添加到工程的Application分组
同时在Application/Inc下建立main.h
4.5 添加头文件路径
这些是必须的,其他按需求添加
4.6 添加全局宏定义N32G45X, USE_STDPERIPH_DRIVER
相当于是对固件库N32G45X的预编译头和使用官方的标准驱动库
这里顺便改O(0)优化,以免在调试的情况下代码进行了过多的优化
4.7 设置debug
这里使用的是ST-Link Debugger,勾选Reset and Run(烧录后立刻重启芯片,这样就会立刻运行了,而不需要手动重启运行)
4.8 修改系统文件外部晶振
由于使用了24Mhz的外部晶振,很重要,否则烧录完芯片会锁死,本人使用的N32开发板上面没有把boot引脚拉出来非常恶心,锁死要手动把boot0接高复位重写,极其痛苦。
这个宏定义在n32g45x.h这个头文件里面,改成开发板实际使用的外部晶振即可
5 验证是否能够成功编译运行
随便写点代码让他在单片机run起来,由于刚刚建立工程,还没有使用单片机的外设,这部分使用纯计算的方式验证是否能够跑通
5.1 main.h编写
//main.h
#ifndef __MAIN_H__
#define __MAIN_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "n32g45x.h"
#ifdef __cplusplus
}
#endif
#endif /* __MAIN_H__ */
5.2 main.cpp编写
//main.cpp
#include "main.h"
#include <stdio.h>
#include <stdint.h>
/**
* @brief Assert failed function by user.
* @param file The name of the call that failed.
* @param line The source line number of the call that failed.
*/
#ifdef USE_FULL_ASSERT
void assert_failed(const uint8_t* expr, const uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif // USE_FULL_ASSERT
/**
* @brief Main program.
*/
int test = 0;
int main(void)
{
while(1)
{
test ++;
}
}
5.3 连接设备并且debug
直接在test打断点,如果每次运行一次test都有正常再涨,那应该没什么大问题