前言
最近公司给了一个恩智浦的MPC5748G开发板,这是一款基于Power Archite技术的32位汽车MCU,好像要几千块,所以抓紧学习一下。
主控芯片为SPC5748GHMKU6:
可对照查看芯片配置。
1、开发环境配置
需要下载S32 DS for Power Architecture,网址在这里:下载地址。这个软件是恩智浦公司专门为其开发板设计的,所以是免费的,下载完还需要安装一个SDK,可以参考https://blog.csdn.net/weifengdq/article/details/103899641的安装步骤。
,
开发界面:
2、硬件连接
首次使用可以参考NXP官网的,网址在这:快速入门。
我用了JTAG线烧程序,12V单独供电,官网的快速入门使用的是USB-micro供电+烧写,但是这种方式可能比较慢而且不太稳定(老师说的),这两种不同的接线方式需要通过跳线选择:
硬件连接如下:
3、编程思路
MPC5748G有8个供用户使用的LED灯,和两个按键,GPIO就非常非常多了,基本J2 J3 J4和J12 J13 J14每一个引脚都可以做GPIO口。
-
8个LED均为低电平有效,也就是端口输入为0时亮灯:
-
2个按键高电平有效,也就是按下按键时端口输入为1:
- GPIO非常多:
既然要写点灯的程序,不如就把每一个LED和每一个按键都用上,这样也可以记一下端口号,GPIO因为太多,就只挑一个用一下试一试,我用的是PG2,为J4的第一个引脚。
这样的话使用的端口一共有11位,分别是8个LED,2个SW和1个GPIO:
注:这段代码是后面配置好自动生成的。
具体功能为:按下SW1按键后,LED全亮,PG2置1。按下SW2按键后LED全灭,PG2置0。
4、新建工程
- 首先打开DS32,新建一个自己的项目:
- 然后选择芯片,起个名字:
- 选择使用几个内核,我只用了一个,点1、2除反选Z4_2和Z2_2两个核,然后点3添加SDK(就是一个图形化界面配置引脚的工具包):
- 选择MPC5748G_SDK_Z4_0 3.0.0版本(不知道3.0.0和3.0.3有什么区别,后面再了解),点击Finsh开始生成工程。
- 工程配置完以后就出现这个界面,可能我调整过了界面的各个模块大家都不太一样,不过文件路径都是一样的,可以在Sources文件夹里看到main文件。
- 接下来使用SDK配置11个端口,借一张别人的图参考链接,配置PJ[4]过程如图所示,除PJ4外,还需配置其他7个LED为GPIO输出,PA0 PA10 PA4 PA7 PC4 PH13 PH5:
- 两个按键端口为GPIO输入,分别为PA3和PE12,均设置为输入:
-
一个GPIO使用了PG2:
-
配置好11个引脚后点击生成代码即可:
5、主函数编写
- 刚刚生成代码已经配置好了各个引脚,在pin_mux.c中有个g_pin_mux_InitConfigArr的结构体,里面有每一个引脚的详细配置:
- 参数NUM_OF_CONFIGURED_PINS为引脚数量:11。
- 需要修改的只有main.c里面的内容,首先在头文件里定义每一个端口号:
/* User includes (#include below this line is not maintained by Processor Expert) */
#define BTN_PORT PTA
#define BTN_PIN 3U
#define BTN_PORT0 PTE
#define BTN_PIN0 12U
#define PORT0 PTA
#define LED0 7
#define PORT1 PTA
#define LED1 10
#define PORT2 PTH
#define LED2 13
#define PORT3 PTC
#define LED3 4
#define PORT4 PTH
#define LED4 5
#define PORT5 PTJ
#define LED5 4U
#define PORT6 PTA
#define LED6 0
#define PORT7 PTA
#define LED7 4
#define GPIO_PORT PTG
#define GPIO_PIN 2
- main函数内部代码从这里开始写,前三行分别为初始化时钟和引脚:
/* Write your code here */
/* For example: for(;;) { } */
/* Initialize and configure clocks */
CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_FORCIBLE);
/* Initialize pins */
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
while(1) {
uint32_t btn_return = (PINS_DRV_ReadPins(BTN_PORT) >> BTN_PIN) & 0x01;//read SW1
uint32_t btn_return0 = (PINS_DRV_ReadPins(BTN_PORT0) >> BTN_PIN0) & 0x01;//read SW2
if(btn_return == 1) { //button pressed
PINS_DRV_WritePin(PORT0, LED0, 0);
PINS_DRV_WritePin(PORT1, LED1, 0);
PINS_DRV_WritePin(PORT2, LED2, 0);
PINS_DRV_WritePin(PORT3, LED3, 0);
PINS_DRV_WritePin(PORT4, LED4, 0); //led on
PINS_DRV_WritePin(PORT5, LED5, 0);
PINS_DRV_WritePin(PORT6, LED6, 0);
PINS_DRV_WritePin(PORT7, LED7, 0);
PINS_DRV_WritePin(GPIO_PORT, GPIO_PIN, 1); //PG2 1
}
if(btn_return0 == 1) {
PINS_DRV_WritePin(PORT0, LED0, 1);
PINS_DRV_WritePin(PORT1, LED1, 1);
PINS_DRV_WritePin(PORT2, LED2, 1);
PINS_DRV_WritePin(PORT3, LED3, 1);
PINS_DRV_WritePin(PORT4, LED4, 1); //led off
PINS_DRV_WritePin(PORT5, LED5, 1);
PINS_DRV_WritePin(PORT6, LED6, 1);
PINS_DRV_WritePin(PORT7, LED7, 1);
PINS_DRV_WritePin(GPIO_PORT, GPIO_PIN, 0); //PG2 0
}
}
6、调试编译
- 点击左上角小锤子,选择Debug_RAM:
- 等待编译完成:
- 点Debug右边的三角,选择Debug Configurations…
- 开始烧写:
- 点击运行:
- 此时,按下右下角的SW1(虽然标的是SW4),八个LED灯全部亮起,使用万用表测一下PG2端口,显示为3.3V。
- 按下右上角的SW2按键,八个LED全部灭掉,PG2端口为0V。
7、单步运行
- 双击这里可以在程序的某一行打个断点,
- 点击1运行后程序直接卡在while的第一句这里,点击2即可单步运行,右侧区域可以看到变量的值。
- 如果在这一段运行前按住SW2按键。
uint32_t btn_return0 = (PINS_DRV_ReadPins(BTN_PORT0) >> BTN_PIN0) & 0x01;//read SW2
然后一直点击单步运行,即可看到LED灯一个一个灭掉。
参考:https://blog.csdn.net/weifengdq/article/details/103916550
MPC5748G用户手册以及接口可以在NXP官网找到,需要注册账号,此文用到的文档已上传CSDN:用户手册
代码已上传github:
https://github.com/aprilaaa/MPC5748Gworkspace/tree/main