1、S32K1XX 系列 keil下新建工程

S32K1XX 系列 keil下新建工程

1、新建6个文件夹

名称如下:
在这里插入图片描述

Project:用于存放工程文件;

HARDWARE:驱动层,用于存放驱动文件,如:GPIO、UART、SPI、I2C、CAN;

DEVICE:设备层,用于存放设备文件,如MU6050、LCD;

MiddleLayer:中间层,用于在应用层和设备层搭建桥梁;

APPLICATION:应用层,存放具体应用程序,呼吸灯;

COMMON:公共文件,存放公用文件;

2、新建工程

2.1、点击Project-> New uVision Project

在这里插入图片描述

在这里插入图片描述

2.2、选择芯片型号,根据需求选择,本次测试采样S32K116

在这里插入图片描述

2.3、勾选 CMSIS下的CORE和Device下的Startup,点击OK

在这里插入图片描述

2.4、生成如下工程

在这里插入图片描述

2.5、在工程中添加文件夹

在这里插入图片描述

2.6、新建main.c文件,并添加到Project下

在这里插入图片描述

2.7、编译之后会出现报错

在这里插入图片描述

解决如下:

在这里插入图片描述

在这里插入图片描述
2.8、在C/C++目录下,取消勾选C99 Mode

在这里插入图片描述

2.9、再次编译,无警告无报错

在这里插入图片描述

3、验证工程

在HARDWARE文件夹下新建:GPIO.c、GPIO.h两个文件

GPIO.c进行GPIO设置

#include "GPIO.h"

/* 定义五个指针数组保存 GPIOX 的地址 */
GPIO_MemMapPtr GPIOX[5] = {PTA, PTB, PTC, PTD, PTE}; //定义五个指针数组保存 GPIOX 的地址
PORT_MemMapPtr PORTX[5] = {PORTA, PORTB, PORTC, PORTD, PORTE};


void GPIO_PinInit(PTXn_e ptx_n, GPIO_CFG dir, uint8_t data)
{

    uint8_t ptx, ptn;

    ptx = PTX(ptx_n);
    ptn = PTn(ptx_n);

    /* 使能端口时钟 */
    PCC->PCCn[PCC_PORTA_INDEX + ptx] = PCC_PCCn_CGC_MASK;

    /* 清除之前的复用功能 */
    PORTX[ptx]->PCR[ptn] &= ~(uint32)PORT_PCR_MUX_MASK;

    /* 设置复用功能为GPIO即普通IO口 */
    PORTX[ptx]->PCR[ptn] |= PORT_PCR_MUX(1);

    /* 配置GPIO模式 */
    PORTX[ptx]->PCR[ptn] |= dir;

    /* 设置GPIO方向 */
    if (dir)
    {
        GPIOX[ptx]->PDDR |= (uint32)(1 << ptn);
    }
    else
    {
        GPIOX[ptx]->PDDR &= ~(uint32)(1 << ptn);
    }

    /* 设置端口默认状态 */
    if (data)
    {
        GPIOX[ptx]->PDOR |= (uint32)(1 << ptn);
    }
    else
    {
        GPIOX[ptx]->PDOR &= ~(uint32)(1 << ptn);
    }
}

void GPIO_PinWrite(PTXn_e ptx_n, uint8_t data)
{
    uint8_t ptx, ptn;

    ptx = PTX(ptx_n);
    ptn = PTn(ptx_n);

    /* 设置端口默认状态 */
    if (data)
    {
        GPIOX[ptx]->PDOR |= (uint32)(1 << ptn);
    }
    else
    {
        GPIOX[ptx]->PDOR &= ~(uint32)(1 << ptn);
    }
}

GPIO.h

#ifndef __GPIO_H_
#define __GPIO_H_
#include "common.h"
#include "stdint.h"
#include "S32K116.h"


//定义管脚状态
typedef enum GPIO_CFG
{
    //这里的值不能改!!!
    GPI         = 0x00,                       //定义管脚输入方向      GPIOx_PDDRn里,0表示输入,1表示输出
    GPO         = 0x01,                       //定义管脚输出方向

    GPI_DOWN    = 0x02,                       //输入下拉              PORTx_PCRn需要PE=1,PS=0
    GPI_UP      = 0x03,                       //输入上拉              PORTx_PCRn需要PE=1,PS=1
    GPI_PF      = 0x10,                       //输入,带无源滤波器,滤波范围:10 MHz ~ 30 MHz 。不支持高速接口(>=2MHz)  0b10000           Passive Filter Enable
    GPI_DOWN_PF = GPI_DOWN | GPI_PF,          //输入下拉,带无源滤波器
    GPI_UP_PF   = GPI_UP   | GPI_PF,          //输入上拉,带无源滤波器

    GPO_HDS     = 0x41,                       //输出高驱动能力   0b100 0001    High drive strength
    GPO_SSR     = 0x05,                       //输出慢变化率     0b101         Slow slew rate
    GPO_HDS_SSR = GPO_HDS | GPO_SSR,          //输出高驱动能力、慢变化率
} GPIO_CFG;  //最低位为0,肯定是输入;GPI_UP 和 GPI_UP_PF的最低位为1,其他为输出



void GPIO_PinInit(PTXn_e ptx_n, GPIO_CFG dir, uint8_t data);
void GPIO_PinWrite(PTXn_e ptx_n, uint8_t data);

#endif

新建clocks_and_modes_S32K11x.c和clocks_and_modes_S32K11x.h文件,用于初始化系统时钟;
clocks_and_modes_S32K11x.c

#include "S32K116.h"	/* include peripheral declarations S32K116 */
#include "clocks_and_modes_S32K11x.h"

void SOSC_init_40MHz(void)
{
	/*! SOSC Initialization (40 MHz):
	 * =============================
	 * */
	SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1)|
				   SCG_SOSCDIV_SOSCDIV2(1);  	/* SOSCDIV1 & SOSCDIV2 =1: divide by 1 		*/
	SCG->SOSCCFG  =	SCG_SOSCCFG_RANGE(3)|		/* Range=3: High frequency range selected	*/
					SCG_SOSCCFG_EREFS_MASK;		/* HGO=0:   Config xtal osc for low power 	*/
  	  	  	  	  	  	  	  	  	  	  	  	/* EREFS=1: Input is external XTAL 			*/

  while(SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK); 	/* Ensure SOSCCSR unlocked 							*/
  SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN_MASK; 		/* LK=0:          SOSCCSR can be written 				*/
												/* SOSCCMRE=0:    OSC CLK monitor IRQ if enabled 		*/
												/* SOSCCM=0:      OSC CLK monitor disabled 			*/
												/* SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled */
												/* SOSCLPEN=0:    Sys OSC disabled in VLP modes 		*/
												/* SOSCSTEN=0:    Sys OSC disabled in Stop modes 		*/
												/* SOSCEN=1:      Enable oscillator 					*/

while(!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK));	/* Wait for sys OSC clk valid */
}

void RUN_mode_48MHz (void)
{
	/*! Fast IRC is enabled and trimmed to 48 MHz in reset (default).
	 * Set FIRCDIV1 & FIRCDIV2 = 1: divide by 1 = 48 MHz.
	 * */
	SCG->FIRCDIV = SCG_FIRCDIV_FIRCDIV1(1)|
				   SCG_FIRCDIV_FIRCDIV2(1);

	/*! Fast IRC is enabled in high range (8MHz) in reset (default).
	 * Set FIRCDIV1 & FIRCDIV2 = 1: divide by 1 = 8 MHz.
	 * */
	SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1)|
				   SCG_SIRCDIV_SIRCDIV2(1);

/*!
 *  Select FIRC for RUN mode.
 *  ===========================
 */
  SCG->RCCR=SCG_RCCR_SCS(3)      /* Select FIRC as clock source 								*/
    |SCG_RCCR_DIVCORE(0b00)      /* DIVCORE=0, div. by 1: Core clock = 48 MHz 					*/
    |SCG_RCCR_DIVBUS(0b00)       /* DIVBUS=0, div. by 1: bus clock = 48 MHz 					*/
    |SCG_RCCR_DIVSLOW(0b01);     /* DIVSLOW=1, div. by 2: SCG slow, flash clock= 24 MHz			*/

  while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 3) {}	/* Wait for sys clk src = SPLL */
}

clocks_and_modes_S32K11x.h

#ifndef CLOCKS_AND_MODES_S32K11X_H_
#define CLOCKS_AND_MODES_S32K11X_H_

void SOSC_init_40MHz (void);
void RUN_mode_48MHz (void);

#endif /* CLOCKS_AND_MODES_S32K11X_H_ */

在main函数中对GPIO进行操作,将GPIO -PTB2设置为输出模式,输出高电平。
main.c

#include <stdio.h>
#include "S32K116.h"	/* include peripheral declarations S32K116 */
#include "clocks_and_modes_S32K11x.h"
#include "GPIO.h"

//关闭看门狗
void WDOG_disable (void)
{
  WDOG->CNT=0xD928C520;     /* Unlock watchdog 		*/
  WDOG->TOVAL=0x0000FFFF;   /* Maximum timeout value 	*/
  WDOG->CS = 0x00002100;    /* Disable watchdog 		*/
}


//void LED_init()
//{
//		/*LED--*/
//	PCC->PCCn[PCC_PORTB_INDEX ]|=PCC_PCCn_CGC_MASK; //使能PTD端口时钟
//	PORTB->PCR[2] = PORT_PCR_MUX(1);/* Port : MUX = GPIO 				*/
//	PTB->PDDR |= 1<<2;            	 /* Port: Data direction  */
//	PTB->PSOR |= 1<<2;               /* 高电平*/
	PTA->PCOR |= 1<<2;
//}


int main()
{
	WDOG_disable();
	SOSC_init_40MHz(); 	/* Initialize system oscillator for 40 MHz xtal */
	RUN_mode_48MHz();		/* Init clocks: 48 MHz sys, core and bus, 24 MHz flash. */
//	LED_init();
	
	GPIO_PinInit(PTB2,GPO,0);
	
	while(1)
	{
		GPIO_PinWrite(PTB2,1);
	}
	
	return 0;
}

添加.h文件路径
在这里插入图片描述
并将S32K116.文件保存在common文件夹下
在这里插入图片描述)

配置Jlink下载环境

在这里插入图片描述

选择S32K116

在这里插入图片描述

在这里插入图片描述

点击如下按钮下载工程。
在这里插入图片描述

用万用表或者示波器即可查看PTB2输出高电平。

欢迎各位关注我的公众号:Kevin的学习站,测试例程将会上传到公众号,需要的小伙伴可以下载,整理不易,但您的点赞、关注、收藏就是对我最大的鼓励!

在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
S32K1xx系列MCU是一款针对汽车电子应用设计的微控制器单元。它们具有高度可靠性、低功耗、高精度和强大的计算能力,适用于汽车中的多种应用场景。 首先,S32K1xx系列MCU采用ARM Cortex-M内核架构,提供了高性能的处理能力和低功耗的设计。它们具有丰富的外设功能,包括通用输入/输出引脚(GPIO)、模拟输入/输出(ADC/DAC)、定时器/计数器、串行通信接口(UART/SPI/I2C)、CAN总线接口等。这些外设能够满足汽车电子系统对于数据采集、信号处理、通信和控制的需求。 其次,S32K1xx系列MCU在汽车电子应用方面具有广泛的应用能力。它们支持多种传感器接口,包括温度传感器、压力传感器、加速度传感器等,可以用于汽车的温度监测、压力检测、车身稳定控制等功能。此外,S32K1xx还支持CAN总线通信,能够实现车辆网络与外部设备的数据交互,用于车辆诊断、通信控制等方面。 再者,S32K1xx系列MCU具有严格的功能安全和可靠性要求。它们采用了多种安全机制,如双核运行模式、错误检测与纠正码、时钟监视等,来提高系统的稳定性和可靠性。这使得S32K1xx系列MCU在汽车的关键应用领域,如刹车系统、驱动系统等,能够提供高度可靠的控制和保护功能。 总的来说,S32K1xx系列MCU应用广泛,可用于汽车电子系统中的多个方面,包括传感器接口、通信控制、数据采集与处理等。它们具有高性能、低功耗、安全可靠的特点,能够满足汽车电子系统对于性能和功能的要求。因此,S32K1xx系列MCU成为了汽车电子领域中的重要选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin的学习站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值