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的学习站,测试例程将会上传到公众号,需要的小伙伴可以下载,整理不易,但您的点赞、关注、收藏就是对我最大的鼓励!