S32K1xx系列使用指南,上古卷轴5代码怎么用

卷轴 4
NXPSemiconductorsApplicationNote DocumentNumber:AN5413Rev.5,12/2020 S32K1xx系列使用指南 软件示例和启动代码来行使微控制器的功能 作者:恩智浦半导体 URL:/docs/en/application-note/AN5413.pdf 1简介 本应用笔记提供了软件示例,并描述了帮助用户开始使用S32K1xx系列MCU所需的必要启动步骤。
本文档描述了提供的一些示例,完整的源代码、项目和文档可在网页/?
q=s32support查找,项目使用NXP的S32DesignStudiov3.3实施,并在S32K144评估板版本S32K144EVB-Q100上进行测试。
要访问项目及其相应文档,请执行以下操作: •请参阅第6节以导入此处提到的示例,以及S32K14x和S32K11x的其他示例。
•每个项目的文件向客户提供模块的说明以及所用功能和或驱动程序的摘要。
更多详细信息,请参阅第节。
目录 1简介.......................................................................................12软件示例................................................................................2 2.1HelloWorld.................................................................42.2HelloWorld+时钟.....................................................62.3HelloWorld+中断....................................................112.4DMA.........................................................................162.5TimedI/O(FTM).......................................................222.6ADC-SW触发器......................................................282.7UART.........................................................................332.8SPI............................................................................382.9CAN2.0.....................................................................432.10CANFD...................................................................532.11其他示例和文档....................................................643Startup代码.........................................................................653.1S32DesignStudio,S32K14xflashtarget..................654头文件备忘单......................................................................665新增项目.............................................................................676S32K1xx系列使用说明存储库............................................676.1从S32K1xx系列使用说明存储库导入项目.............677修改历史.............................................................................70 软件示例 这些示例和其他示例也被移植到ARM®KeilTMMDK工具。
参见ARMKeil应用笔记304,/documentation/kan304/latest/以获取更多信息。
2软件示例 下表列出了本应用笔记中的示例。
这三个HelloWorld示例旨在作为基础项目,可以复制并添加代码以创建新项目。

1.示例清单 ExampleHelloWorld helloPrograms HelloWorld+Clockshello_clocks HelloWorld+Clocks+hello_clocks_interruptsInterrupts DMA eDMA TimedI/O(FTM) FTM ADC-SWTrigger ADC UART UART Summary Simplestproject:•ConfigureGPIO•OutputtoLEDfollowsswitchinput moninitializationforclocksandLPIT:•InitializeSystemOscillator(SOSC)for8MHzcrystal•InitializeSPLLwith8MHzSOSCinputtoprovide80MHzclock•ChangeNormalRUNmodeclockfromdefaultFIRCto160MHzSPLL (beforedividers)•InitializeLPITchanneltocount40Mclocks(1secondtimeout)•ToggleoutputtoLEDeveryLPITtimeout TheHelloWorld+ClockexampleismodifiedtoservicethePITchanneltimeoutwithaninterruptserviceroute:•Initializesystemclockto80MHz•InitializeanLPITchannelfor1secondtimeoutandenableitsinterrupt•Waitforever•AtLPITtimeoutinterrupt,toggleoutputtoLED Transferastringofbytestoasinglebytelocation:•InitializeaTransferControlDescriptor(TCD)•Usesoftware(insteadofperipheralDMArequests)toinitiatetransfers montimedI/OfunctionswithFTM:•Modulecounterinitialization•PulseWidthMOdulation•OutputCompare•InputCapture Performsimpleanalogtodigitalconversionsusingsoftwaretrigger:•InitializeADCforSWtrigger,continuousmode•Loop: -Convertchannelconnectedtopotonevaluationboard-Scaleresultto0to5000mV-LightevaluationboardLEDstoreflectvoltagelevel-ConvertchannelconnectedtotheADChighreferencevoltage Transmitandreceivecharacters:•InitializeUARTfor9600baud,1,noparity•Loop: -Transmitstring,thenapromptcharacteronnewline-Whencharacterisreceived,echoitback NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 2/71 ExampleSPICAN2.0 CANFD ProgramsLPSPIFlexCAN FlexCAN_FD 软件示例 Table1.Listofexamples Summary TransmitandreceiveaSPIframe:•InitializeLPSPIfor1MBaud,PCS3whichisconnectedtoSPConEVB•WaitforTxFIFOtohaveatleastoneavailableslotthenissuetransmit•WaitforRxFIFOtohaveatleastonereceivedframethenreaddata TransmitandreceiveaneightbyteCAN2.0messageat500KHz:•InitializeFlexCANandMessageBuffer4toreceiveamessage•TransmitoneframeusingMessageBuffer0•Loop: -IfMessageBuffer4receivedmessageflagisset,readmessage-IfMessageBuffer0transmitdoneflagisset,transmitanothermessage Transmitandreceivea64byteCANFDmessageat500KHzand1or2MHz:•InitializeFlexCANandMessageBuffer4toreceiveamessage•TransmitoneframeusingMessageBuffer0Loop:-IfMessageBuffer4receivedmessageflagisset,readmessage-IfMessageBuffer0transmitdoneflagisset,transmitanothermessage 如果使用S32K148EVB,则应用笔记示例中使用的许多I/O端口是不同的。
汇总见表
2。

2.EVB的应用笔记示例I/O端口差异摘要 I/O S32K144EVB S32K148EVB BlueLED PTD0 PTE21 GreenLED PTD16 PTE22 RedLED PTD15 PTE23 BTN0FTM0Channel01 PTC12(SW2)PTD15(RedLED) PTC12(SW3)PTD15(noLED) FTM0Channel1 PTD16(GreenLED) PTD16(noLED) FTM0Channel6 PTE8 PTE8 PotentiometertoADC PTC14(ADCChannel12) PTC28(ADCchannel28) UART1_RX PTC6 PTC6 UART1_TX PTC7 PTC7 LPSPI1_SOUT PTB16 PTA27 LPSPI1_SIN PTB15 PTA29 LPSPI1_PCSx PTB17
PCS3(toUJA1169) PTA26PCS0(toUJA1132) LPSPI1_SCK PTB14 PTA28 CAN0_TX PTE5 PTE5 CAN0_RX PTE4 1ForLEDconnectionstoFTMexamplewithPWMoutputs,useFTM4insteadofFTM0. PTE4 NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 3/71 2.1HelloWorld 软件示例 2.1.1描述 总结:这个简短的项目是学习GPIO的起点。
轮询输入以检测高电平或低电平。
根据输入状态设置输出。
如果在S32K14x评估板上运行代码,按下按钮0将点亮蓝色LED,如下图所示。
S32K144EVBVDD BTN0(SW2) S32K144 PTC12 GPIO PTD0 VDD BlueLED 图
1.HelloWorld方框图 2.1.2设计 •主函数之前的初始化:—定义中断地址(如复位处理器)和闪存配置—初始化堆栈指针、寄存器—禁用看门狗(如果已配置)—初始化向量表—将变量从ROM复制到RAM,并将数据段(.bss)归零—解除屏蔽中断 •禁用看门狗•启用GPIO模块时钟并配置GPIO端口: —PTC12:GPIO输入(转到评估板上的BTN0)—PTD0:GPIO输出(转到蓝色LED)•环路:—如果按下BTN0(输入=1) –打开LED(输出=0)—其他(输入=0) –关闭LED(输出=1) NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 4/71 软件示例 2.1.3 代码 2.1.3.1hello.c #include"S32K144.h" /*includeperipheraldeclarationsS32K144*/ #definePTD00#definePTC1212 /*PortPTD0,bit0:FRDMEVBoutputtoblueLED*//*PortPTC12,bit12:FRDMEVBinputfromBTN0[SW2]*/ voidWDOG_disable(void){WDOG->CNT=0xD928C520;WDOG->TOVAL=0x0000FFFF;WDOG->CS=0x00002100; } /*Unlockwatchdog*//*Maximumtimeoutvalue*//*Disablewatchdog*/ intmain(void) {intcounter= 0; WDOG_disable(); /*Enableclockstoperipherals(PORTmodules)*/ PCC->PCCn[PCC_PORTC_INDEX]=PCC_PCCn_CGC_MASK;/*EnableclocktoPORTC*/ PCC->PCCn[PCC_PORTD_INDEX]=PCC_PCCn_CGC_MASK;/*EnableclocktoPORTD*/ /*ConfigureportC12asGPIOinput(BTN0[SW2]onEVB)*/ PTC->PDDR&=~(1<PCR[12]=0x00000110;/*PortC12:MUX=GPIO,inputfilterenabled*/ /*ConfigureportD0asGPIOoutput(LEDonEVB)*/ PTD->PDDR|=1<PCR[0]=0x00000100;/*PortD0:MUX=GPIO*/ for(;;){if(PTC->PDIR&(1<PCOR|=1<PSOR|=1<核心时钟设置为80MHz。
LPIT0通道0被配置为计数一秒的SPLL时钟。
软件轮询通道的超时标志,并在标志设置时将GPIO输出切换到LED。
S32K144EVB S32K144 XTAL8MHz SOSC_CLKOSC SCG_SOSCDIV SOSC_DIV1_CLK(8MHz)SOSC_DIV2_CLK(8MHz) SPLL_CLK(160MHz)PLL SCG_SPLLDIV SPLL_DIV1_CLK(80MHz)SPLL_DIV2_CLK(40MHz) FIRC48MHz FIRC_CLK SIRC8MHz SIRC_CLK SPLL_DIV2_CLK(40MHz) FIRC_DIV2_CLKSIRC_DIV2_CLKSOSC_DIV2_CLK LPIT0 .Functionalclock (40MHz). Moduleclock (BUS_CLK,40MHz) SCG_RCCR CORE_CLK,SYSCLK(80MHz) SCG_RCCR[SCS] SCG_RCCR BUS_CLK(40MHz) SCG_RCCR FLASH_CLK, SCG_SLOW_CLK(262/3MHz) Chan0(1sec) SoftwarepollingcontrolsGPIO GPIO PTD0 (toLED) 图
2.HelloWorld+Clocks方框图 NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 6/71 软件示例 表
3.时钟、分频器要求和常见配置 Clock DividerRequirements SlowRUNNormalHighSpeedVeryLowPowerRUN, (typically RUN RUN VLPR withFIRC)(withSPLL)(withSPLL)(withSIRCorSOSC) CORE_CLK,SYS_CLK DIVCORE:•>=BUS_CLK BUS_CLK DIVBUS:•CORE_CLKdividedbyinteger FLASH_CLK, DIVSLOW: SCG_SLOW_CLK•CORE_CLKdividedbyinteger •CORE_CLK/FLASH_CLK=8max. 48MHz48MHz24MHz 80MHz(max) 40MHz(max) 262/3MHz(max) 112MHz(max) 56MHz(max) 28MHz(max) 4MHz4MHz1MHz 表2总结了时钟频率和关系。
在切换新时钟之前,必须初始化核心时钟、系统时钟、总线时钟和闪存时钟的分频器。
在时钟开关接通之前,分频器不会有新的值。
2.2.2设计 •初始化端口引脚:—启用端口D模块的时钟—PTD0:GPIO输出(转到蓝色LED) •为8MHz晶体初始化系统振荡器(SOSC)—初始化所需的SOSC分配器—配置范围、高增益、参考—确保SOSC控制和状态寄存器已解锁—在SOSC控制和状态寄存器中启用SOSC—等待SOSC生效 •使用8MHzSOSC将系统PLL(SPLL)初始化为160MHz—确保禁用SPLL以允许配置—初始化所需的SPLL除法器—初始化PLL参考时钟分频器和系统PLL乘法器1–Fpll=Fosc/PLL参考时钟分频器x系统PLL乘法器/2=8MHz/1x20/2=160MHz—确保SPLL控制和状态寄存器已解锁—在SPLL控制和状态寄存器中启用SPLL—等待SPLL生效 •初始化LPIT0通道0:—启用SPLL_DIV2_时钟的时钟源—启用时钟至LPIT0寄存器
1.VCOoutputfrequency,hasaminimumof180MHzandmaximumof320MHzperS32K1xxDataSheetrev.10S32K1xxSeriesCookbook,Rev.5,December2020 NXPSemiconductors 7/71 —启用LPIT0模块—初始化通道0: –超时=1秒时钟–将模式设置为32位计数器并启用通道0•将正常运行模式时钟更改为SPLL—为新目标时钟频率初始化内核、总线和闪存的时钟分频器—开关系统时钟输入至SPLL(分频器前160MHz)•环路:—等待LPIT0通道0标志—增量计数器,切换PTD0GPIO输出并清除通道标志 2.2.3代码 2.2.3.1hello_clocks.c #include"S32K144.h" /*includeperipheraldeclarationsS32K144*/ #include"clocks_and_modes.h" intlpit0_ch0_flag_counter=0;/*LPIT0timeoutcounter*/ 软件示例 voidPORT_init(void){ PCC->PCCn[PCC_PORTD_INDEX]=PCC_PCCn_CGC_MASK;/*EnableclockforPORTD*/ PTD->PDDR|=1<<0; /*PortD0:DataDirection=output*/ PORTD->PCR[0]=0x00000100;/*PortD0:MUX=ALT1,GPIO(toblueLEDonEVB)*/ } voidLPIT0_init(void){ PCC->PCCn[PCC_LPIT_INDEX]=PCC_PCCn_PCS
(6);/*ClockSrc=6(SPLL2_DIV2_CLK)*/ PCC->PCCn[PCC_LPIT_INDEX]|=PCC_PCCn_CGC_MASK;/*EnableclktoLPIT0regs*/ LPIT0->MCR=0x00000001;/*DBG_EN-0:TimerchansinDebugmode*/ /*DOZE_EN=0:TimerchansarepedinDOZEmode*/ /*SW_RST=0:SWresetdoesnotresettimerchans,regs*/ /*M_CEN=1:enablemoduleclk(allowswritingotherLPIT0regs)*/ LPIT0->TMR[0].TVAL=40000000;/*Chan0Timeoutperiod:40Mclocks*/ LPIT0->TMR[0].TCTRL=0x00000001;/*T_EN=1:Timerchannelisenabled*/ /*CHAIN=0:channelchainingisdisabled*/ /*MODE=0:32periodiccountermode*/ /*TSOT=0:Timerdecrementsimmediatelybasedonrestart*/ /*TSOI=0:Timerdoesnotaftertimeout*/ /*TROT=0Timerwillnotreloadontrigger*/ /*TRG_SRC=0:Externaltriggersource*/ /*TRG_SEL=0:Timerchan0triggersourceisselected*/ } NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 8/71 软件示例 voidWDOG_disable(void){WDOG->CNT=0xD928C520;WDOG->TOVAL=0x0000FFFF;WDOG->CS=0x00002100; } /*Unlockwatchdog*//*Maximumtimeoutvalue*//*Disablewatchdog*/ intmain(void){WDOG_disable();PORT_init();SOSC_init_8MHz();SPLL_init_160MHz();NormalRUNmode_80MHz();LPIT0_init(); /*Configureports*//*Initializesystemoscillatorfor8MHzxtal*/ /*Initializesysclkto160MHzwith8MHzSOSC*//*Initclocks:80MHzsysclk&core,40MHzbus,20MHzflash*//*InitializePIT0for1secondtimeout*/ for(;;){ /*ToggleoutputtoLEDeveryLPIT0timeout*/ while(0==(LPIT0->MSR&LPIT_MSR_TIF0_MASK)){}/*WaitforLPIT0CH0Flag*/ lpit0_ch0_flag_counter++; /*IncrementLPIT0timeoutcounter*/ PTD->PTOR|=1<<0; /*ToggleoutputonportD0(blueLED)*/ LPIT0->MSR|=LPIT_MSR_TIF0_MASK;/*ClearLPIT0timerflag0*/ } NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 9/71 2.2.3.2clocks_and_modes.c #include"S32K144.h" /*includeperipheraldeclarationsS32K144*/ #include"clocks_and_modes.h" 软件示例 voidSOSC_init_8MHz(void){ SCG->SOSCDIV=0x00000101;/*SOSCDIV1&SOSCDIV2=1:divideby1*/ SCG->SOSCCFG=0x00000024;/*Range=2:Mediumfreq(SOSCbetween1MHz-8MHz)*/ /*HGO=0:Configxtaloscforlowpower*/ /*EREFS=1:InputisexternalXTAL*/ while(SCG->SOSCCSR&SCG_SOSCCSR_LK_MASK);/*EnsureSOSCCSRunlocked*/ SCG->SOSCCSR=0x00000001;/*LK=0: SOSCCSRcanbewritten*/ /*SOSCCMRE=0:OSCCLKmonitorIRQifenabled*/ /*SOSCCM=0: OSCCLKmonitordisabled*/ /*SOSCERCLKEN=0:SysOSC3VERCLKoutputclkdisabled*/ /*SOSCLPEN=0:SysOSCdisabledinVLPmodes*/ /*SOSCSTEN=0:SysOSCdisabledinmodes*/ /*SOSCEN=1: Enableoscillator*/ while(!
(SCG->SOSCCSR&SCG_SOSCCSR_SOSCVLD_MASK));/*WaitforsysOSCclkvalid*/ } voidSPLL_init_160MHz(void){ while(SCG->SPLLCSR&SCG_SPLLCSR_LK_MASK);/*EnsureSPLLCSRunlocked*/ SCG->SPLLCSR=0x00000000;/*SPLLEN=0:SPLLisdisabled(default)*/ SCG->SPLLDIV=0x00000302;/*SPLLDIV1divideby2;SPLLDIV2divideby4*/ SCG->SPLLCFG=0x00180000;/*PREDIV=0:DivideSOSC_CLKby0+1=1*/ /*MULT=24:Multiplysyspllby4+24=40*/ /*SPLL_CLK=8MHz/1*40/2=160MHz*/ while(SCG->SPLLCSR&SCG_SPLLCSR_LK_MASK);/*EnsureSPLLCSRunlocked*/ SCG->SPLLCSR=0x00000001;/*LK=0:SPLLCSRcanbewritten*/ /*SPLLCMRE=0:SPLLCLKmonitorIRQifenabled*/ /*SPLLCM=0:SPLLCLKmonitordisabled*/ /*SPLLSTEN=0:SPLLdisabledinmodes*/ /*SPLLEN=1:EnableSPLL*/ while(!
(SCG->SPLLCSR&SCG_SPLLCSR_SPLLVLD_MASK));/*WaitforSPLLvalid*/ } voidNormalRUNmode_80MHz(void){/*ChangetonormalRUNmodewith8MHzSOSC,80MHzPLL*/ SCG->RCCR=SCG_RCCR_SCS
(6) /*PLLasclocksource*/ |SCG_RCCR_DIVCORE(0b01) /*DIVCORE=1,div.by2:Coreclock=160/2MHz=80MHz*/ |SCG_RCCR_DIVBUS(0b01) /*DIVBUS=1,div.by2:busclock=40MHz*/ |SCG_RCCR_DIVSLOW(0b10); /*DIVSLOW=2,div.by3:SCGslow,flashclock=262/3MHz*/ while(((SCG->CSR&SCG_CSR_SCS_MASK)>>SCG_CSR_SCS_SHIFT)!
=6){}/*Waitforsysclksrc=SPLL*/ } NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 10/71 软件示例 2.3HelloWorld+中断 2.3.1描述 小结:这个项目与前一个项目相同,只是实现了一个中断来处理计时器标志。
中断处理程序清除该标志并切换输出,而不是软件轮询计时器标志。
对于LPIT0计时器时钟,使用SPLL_DIV2_CLK再次超时1秒。
S32K144EVB XTAL8MHz S32K144 Clocks SPLLDIV2_CLK(40MHz)BUS_CLK(40MHz) SPLL_DIV2_CLK(40MHz) FIRC_DIV2_CLKSIRC_DIV2_CLKSOSC_DIV2_CLK LPIT0 Functionalclock(40MHz) IRQChan0 NVIC .. LPIT0_Ch0_IRQHandlercontrolsGPIO GPIO Moduleclock (BUS_CLK) PTD0(toLED) 图
3.HelloWorld+中断框图 在本例中,要初始化中断,需要对NVIC进行三次写入:•清除任何先前挂起的中断(如果有)—向中断清除挂起寄存器(ICPR)中的中断位写入1•启用所需的中断#—将1写入中断集启用寄存器(ISER)中的中断位•设置中断的优先级—将优先级从0到15写入相应的中断优先级寄存器(IP) NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 11/71 软件示例 下表显示了复位时内核使用的向量。
1至15是内核使用。
15及以上是外围设备、DMA和软件中断使用。
c 表
4.S32K144矢量表(使用S32DesignStudio的示例) Address ContentsinBigEndian memoryview Contents asLittleEndianformataddresses1 Vector# IRQ# (NVICinterruptsource) Symbolinfilestartup_S32K144.S,section.isr_vector, isr_vector Description 0x000000000070002020007000
0 StackTop Initialstackpointer 0x000000041104000000004010
1 Reset_Handler InitialProgramCounter 0x000000084D0400000000044C2 NMI_Handler Non-maskableIRQ(NMI)Vector 0x0000000C4D0400000000044C3 HardFault_Handler HardFaultVector 0x000000104D0400000000044C4 MemManage_Handler MemManageFaultVector 0x000000144D0400000000044C5 BusFault_Handler BusFaultVector 0x000000184D0400000000044C6 UsageFault_Handler UsageFaultVector 0x0000001C0000000000000000
7 0 -NotUsed- 0x000000200000000000000000
8 0 -NotUsed- 0x000000240000000000000000
9 0 -NotUsed- 0x00000028000000000000000010
0 -NotUsed- 0x0000002C4D0400000000044C11 SVC_Handler Supervisorcall(SVC)Vector 0x000000304D0400000000044C12 DebugMon_Handler DebugMonitor 0x00000034000000000000000013
0 -NotUsed- 0x000000384D0400000000044C14 PendSV_Handler Pendablerequestforsystemservice(PendableSrvReq)Vector 0x0000003C4D0400000000044C15 SysTick_Handler Systicktimer(SysTick)Vector 0x000000404D0400000000044C16
0 DMA0_IRQHandler Interrupt#0Vector:DMAChannel0plete 0x000000444D0400000000044C17
1 DMA1_IRQHandler Interrupt#1VectorDMAChannel0plete 0x000000484D0400000000044C18
2 DMA2_IRQHandler Interrupt#2VectorDMAChannel0plete etc. 0X00000100590600000000065864 48LPIT0_Ch0_IRQHandlerInterrupt#48Vector:LPIT0Ch.0 etc.fortherestofthevectors. 1BigEndianaddresseshavetheleastsignificantbit=1forARM™Thumbarchitecture.Foreaseofreadingvectoraddresses,thisbithasbeensettozerointhiscolumn. NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 12/71 软件示例 2.3.2 设计 •初始化端口引脚:—启用端口D模块的时钟—PTD0:GPIO输出(转到蓝色LED) •为8MHz晶体初始化系统振荡器(SOSC):—初始化所需的SOSC分配器—配置范围、高增益、参考—确保SOSC控制和状态寄存器已解锁—在SOSC控制和状态寄存器中启用SOSC—等待SOSC生效 •使用8MHzSOSC将系统PLL(SPLL)初始化为160MHz:—确保禁用SPLL以允许配置—初始化所需的SPLL除法器—初始化PLL参考时钟分频器和系统PLL乘法器1–Fpll=Fosc/PLL参考时钟分频器x系统PLL乘法器/2=8MHz/1x40/2=160MHz—确保SPLL控制和状态寄存器已解锁—在SPLL控制和状态寄存器中启用SPLL—等待SPLL生效 •初始化LPIT0通道0:—启用SPLL_DIV2_时钟的时钟源—启用时钟至LPIT0寄存器—启用LPIT0模块—初始化通道0:–启用通道的中断–超时=1秒时钟–将模式设置为32位计数器并启用通道
0 •将正常运行模式时钟更改为SPLL:—为新目标时钟频率初始化内核、总线和闪存的时钟分频器—开关系统时钟输入至SPLL(分频器前160MHz) •循环:永远等待•LPIT_0通道0中断处理器: —清除通道标志2—增量计数器—切换PTD0GPIO输出
1.VCOoutputfrequency,hasaminimumof180MHzandmaximumof320MHzperS32K1xxDataSheetrev.102.Toensureinterruptflagclearsbeforeroutineexit,performamemoryread-after-writesuchasctr++.Refererence:S32K14xSeriesReferenceManual,Rev.1,08/2016,section3.4.1and S32K1xxSeriesCookbook,Rev.5,December2020 NXPSemiconductors 13/71 2.3.3代码 2.3.3.1hello_interrupts.c #include"S32K144.h" /*includeperipheraldeclarationsS32K144*/ #include"clocks_and_modes.h" 软件示例 intidle_counter=0; /*mainloopidlecounter*/ intlpit0_ch0_flag_counter=0;/*LPIT0chan0timeoutcounter*/ voidNVIC_init_IRQs(void){ FSL_NVIC->ICPR[1]=1<<(48%32);/*IRQ48-LPIT0ch0:clranypendingIRQ*/ FSL_NVIC->ISER[1]=1<<(48%32);/*IRQ48-LPIT0ch0:enableIRQ*/ FSL_NVIC->IP[48]=0x0A; /*IRQ48-LPIT0ch0:priority10of0-15*/ } voidPORT_init(void){ PCC->PCCn[PCC_PORTD_INDEX]=PCC_PCCn_CGC_MASK;/*EnableclockforPORTD*/ PTD->PDDR|=1<<0; /*PortD0:DataDirection=output*/ PORTD->PCR[0]=0x00000100;/*PortD0:MUX=ALT1,GPIO(toblueLEDonEVB)*/ } voidLPIT0_init(void){ PCC->PCCn[PCC_LPIT0_INDEX]=PCC_PCCn_PCS
(6);/*ClockSrc=6(SPLL2_DIV2_CLK)*/ PCC->PCCn[PCC_LPIT0_INDEX]|=PCC_PCCn_CGC_MASK;/*EnableclktoLPIT0regs*/ LPIT0->MCR=0x00000001;/*DBG_EN-0:TimerchansinDebugmode*/ /*DOZE_EN=0:TimerchansarepedinDOZEmode*/ /*SW_RST=0:SWresetdoesnotresettimerchans,regs*/ /*M_CEN=1:enablemoduleclk(allowwritingotherLPIT0regs)*/ LPIT0->MIER=0x00000001;/*TIE0=1:TimerInterruptEnabledfotChan0*/ LPIT0->TVAL0=80000000;/*Chan0Timeoutperiod:80Mclocks*/ LPIT0->TCTRL0=0x00000001;/*T_EN=1:Timerchannelisenabled*/ /*CHAIN=0:channelchainingisdisabled*/ /*MODE=0:32periodiccountermode*/ /*TSOT=0:Timerdecrementsimmediatelybasedonrestart*/ /*TSOI=0:Timerdoesnotaftertimeout*/ /*TROT=0Timerwillnotreloadontrigger*/ /*TRG_SRC=0:Externaltriggersource*/ /*TRG_SEL=0:Timerchan0triggersourceisselected*/ } voidWDOG_disable(void){ WDOG->CNT=0xD928C520;/*Unlockwatchdog*/ WDOG->TOVAL=0x0000FFFF;/*Maximumtimeoutvalue*/ WDOG->CS=0x00002100;/*Disablewatchdog*/ } NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 14/71 软件示例 intmain(void){WDOG_disable();PORT_init();SOSC_init_8MHz();SPLL_init_160MHz();NormalRUNmode_80MHz();NVIC_init_IRQs();LPIT0_init(); /*Configureports*//*Initializesystemoscillatorfor8MHzxtal*/ /*InitializeSPLLto160MHzwith8MHzSOSC*//*Initclocks:80MHzsysclk&core,40MHzbus,20MHzflash*//*Enabledesiredinterruptsandpriorities*//*InitializePIT0for1secondtimeout*/ for(;;){idle_counter++; }} voidLPIT0_Ch0_IRQHandler(void){ LPIT0->MSR|=LPIT_MSR_TIF0_MASK;/*ClearLPIT0timerflag0*/ /*Performread-after-writetoensureflagclearsbeforeISRexit*/ lpit0_ch0_flag_counter++; /*IncrementLPIT0timeoutcounter*/ PTD->PTOR|=1<<0;} /*ToggleoutputonportD0(blueLED)*/ 2.3.3.2clocks_and_modes.cSeecodeinclocks_and_modes.coftheHelloWorld+Clockexample. NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 15/71 2.4DMA 软件示例 2.4.1描述 摘要:初始化eDMA通道的传输控制描述符(TCD),以将字节字符串(“Helloworld”)从SRAM中的阵列传输到单个SRAM字节位置。
这模拟了DMA的一种常见用法,即在DMA控制下,一串数据或命令自动传输到外围设备的输入寄存器。
本示例旨在说明如何设置DMA传输。
S32K144EVBS32K144 XTAL8MHz Clocks SYS_CLK(80MHz) DMA ControlDescriptions (TCDs) MemorySourceData DMAEngine Destination 图
4.DMA示例框图 将DMA与外围设备一起使用时,需要DMAMUX。
参考手册附带的电子表格S32K1xx_DMA_Interrupt_mapping,DMA_ChuMUX表中列出了映射到DMA信道的外围设备分配号。
对于本例中的软件触发传输,不需要DMAMUX。
本教程级示例中未使用的中断,在所有所需传输或其中一半传输完成时非常有用。
一种使用情形是在转换完成后让类似于外围设备的ADC生成DMA请求。
DMA控制器可以自动将转换结果传输到SRAM。
经过所需数量的转换后,DMA控制器可以生成该通道的中断请求。
信道链接和散射-聚集(SGA)是高级功能,可使DMA请求允许在每个DMA请求上进行多个不同的传输,或为每个DMA请求使用不同的TCD。
这些强大的功能可与外围设备一起使用,以实现状态机类型的子系统。
示例:输入信号生成DMA请求,该请求传输数据以初始化多个外围设备。
微循环映射通常不在MCU级应用程序中使用,但对于图形而言,它可以以45度为增量旋转图像。
因为本例中不涉及外设,所以不会发生自动DMA握手。
相反,这里给出的软件握手必须针对每个DMA请求实施(小循环传输): •启动DMA服务请求(为所需通道设置启动位)。
NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 16/71 软件示例 •通过轮询启动和活动状态,等待小回路传输完成。
•重复上述两个步骤,直到主回路完成,如完成位所示对于每次传输,这些步骤都显得“复杂”,在本例中,这只是一个字节。
然而,当使用实际的外围设备时,软件永远不必执行这些步骤;它们是由硬件自动完成的。
启动位通常由请求服务的外围设备通过硬件设置。
DMA处理引擎激活通道后,设置活动位。
如果DMA引擎忙于维护其他通道,可以通过清除起始位来取消传输。
然后需要检查活动位,以确保服务未在该通道上启动。
作为练习,可以修改TCD,使目标是数组而不是单字节位置(提示:将目标声明为字符串并更改DOFF=
1。
) 2.4.2设计 2.4.2.1DMA传输控制描述符(TCD)TCD描述要传输的数据以及如何控制传输。
每个TCD占用eDMA结构内部RAM中的八个32位 字,如下图和表所示。
NXPSemiconductors 图
5.传输控制描述符S32K1xxSeriesCookbook,Rev.5,December2020 17/71 软件示例 Table5.NXPS32K144头文件的TCD初始化 TCDField Option InitializationforTCDnwithfieldvaluex SADDRSOFF — DMA->TCD[n].SADDR — DMA->TCD[n].SOFF =DMA_TCD_SADDR_SADDR(x)=DMA_TCD_SOFF_SOFF(x) SMODSSIZEDMODDSIZE DMA->TCD[n].ATTR.SMOD — DMA->TCD[n].ATTR.SSIZE DMA->TCD[n].ATTR.DMOD DMA->TCD[n].ATTR.DSIZE =
DMA_TCD_ATTR_SMOD(x) =DMA_TCD_ATTR_SSIZE(x)=DMA_TCD_ATTR_DMOD(x)=DMA_TCD_ATTR_DSIZE(x) SMLOEDMLOEMLOFFNBYTES MinorLoopmappingdisabled MinorLoopmappingenabledandOffsetdisabled DMA->TCD[n].NBYTES.MLNO DMA->TCD[n].NBYTES.MLOFFNODMA->TCD[n].NBYTES.MLOFFNODMA->TCD[n].NBYTES.MLOFFNO =DMA_TCD_NBYTES_MLNO_NBYTES(x) =DMA_TCD_NBYTES_MLOFFNO_SMLOE(x)=DMA_TCD_NBYTES_MLOFFNO_DMLOE(x)=DMA_TCD_NBYTES_MLOFFNO_NBYTES(x) SLASTDADDRDOFF MinorLoopmapping DMA->TCD[n].NBYTES.MLOFFYES=DMA_TCD_NBYTES_MLOFFYES_SMLOE(x)DMA->TCD[n].NBYTES.MLOFFYES=DMA_TCD_NBYTES_MLOFFYES_DMLOE(x) enabledandDMA->TCD[n].NBYTES.MLOFFYES=DMA_TCD_NBYTES_MLOFFYES_MLOFF(x)OffsetenabledDMA->TCD[n].NBYTES.MLOFFYES=DMA_TCD_NBYTES_MLOFFYES_NBYTES(x) — DMA->TCD[n].SLAST =DMA_TCD_SLAST_SLAST(x) — DMA->TCD[n].DADDR =DMA_TCD_DADDR_DADDR(x) — DMA->TCD[n].DOFF =DMA_TCD_DOFF_DOFF(x) ChannelLinkingDMA->TCD[n].CITER.ELINKNO = CITER disabled DMA->TCD[n].CITER.ELINKNO = CITER.LINKCH CITER.E.LINK
ChannelLinkingDMA->TCD[n].CITER.ELINKYES= enabled DMA->TCD[n].CITER.ELINKYES= DMA->TCD[n].CITER.ELINKYES= DLAST_SGA — DMA->TCD[n].DLASTSGA = DMA_TCD_CITER_ELINKNO_CITER(x)DMA_TCD_CITER_ELINKNO_ELINK(x) DMA_TCD_CITER_ELINKYES_CITER(x)DMA_TCD_CITER_ELINKYES_LINKCH(x)DMA_TCD_CITER_ELINKYES_ELINK(x) DMA_TCD_DLASTSGA_DLASTSGA(x) START DMA->TCD[n].CSR INT_MAJ DMA->TCD[n].CSR INT_HALF DMA->TCD[n].CSR D_REQ
E_SG —DDMMAA-->>TTCCDD[[nn]]..CCSSRR MAJOR.E.LINK DMA->TCD[n].CSR ACTIVEDONE DMA->TCD[n].CSR MAJOR.LINKCH DMA->TCD[n].CSR BWC DMA->TCD[n].CSR DMA->TCD[n].CSR =
DMA_TCD_CSR_START(x)=DMA_TCD_CSR_INTMAJOR(x)=DMA_TCD_CSR_INTHALF(x)=DMA_TCD_CSR_DREQ(x)=DMA_TCD_CSR_ESG(x)=DMA_TCD_CSR_MAJORELINK(x)=DMA_TCD_CSR_ACTIVE(x)=DMA_TCD_CSR_DONE(x)=DMA_TCD_CSR_MAJORLINKCH(x)=DMA_TCD_CSR_BWC(x) BITER ChannelLinkingDMA->TCD[n].BITER.ELINKNO = BITER.LINKCHdisabled DMA->TCD[n].BITER.ELINKNO = BITER.E_LINKChannelLinkingDMA->TCD[n].BITER.ELINKYES= enabled DMA->TCD[n].BITER.ELINKYES= DMA->TCD[n].BITER.ELINKYES= DMA_TCD_BITER_ELINKNO_BITER(x)DMA_TCD_BITER_ELINKNO_ELINK(x) DMA_TCD_BITER_ELINKYES_BITER(x)DMA_TCD_BITER_ELINKYES_LINKCH(x)DMA_TCD_BITER_ELINKYES_ELINK(x) NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 18/71 软件示例 2.4.2.2 设计步骤 •禁用看门狗 •系统时钟:初始化SOSC为8MHz,sysclk为80MHz,运行模式为80MHz •初始化DMA控制器: -启用DMAMUX模块的时钟(如果软件使用起始位启动DMA,则不需要) -启用所需的频道(如果软件使用起始位启动DMA,则不需要。
) •初始化DMA传输控制描述符(此处仅使用TCD0): -来源 –源地址(SADD):使用字符串“HelloWorld”的地址 –源偏移量(SOFF):每次传输将源地址增加1字节 –源模(SMOD):此处未使用的功能 –源大小(SSIZE):一次读取1字节 –源上次地址调整(SLAST):在主循环后将源地址减少11 -目的地 –目标地址(DADDR):使用单个字节的地址 –目的地偏移量(DOFF):不要在小循环后向目的地地址添加偏移量 –目的地模数(DMOD):此处未使用功能 –目标大小(DSIZE):一次写入1字节 –目的地最后地址调整(DLAST):不在主循环后调整地址 -每个DMA请求的字节数和迭代次数(小循环) –每个DMA请求要传输的字节数(N字节):一个字节 –主循环(CITER和BITER)中的迭代次数/次循环次数:11 –用于小循环后额外迭代的通道到通道链接(BITER
ELINK和CITERELINK):禁用 -控制和状态 –主循环完成后禁用通道(DREQ):禁用通道 –在主循环(INTHALF)中途生成中断请求:禁用 –完成主循环后生成中断请求(INTMARY):禁用 –启用散射聚集(ESG):禁用。
没有其他TCD加载到通道 –在主环路(主链路)后启用信道链路:禁用 –主回路(主回路链接)后的通道链接编号:空-功能禁用 –带宽控制(BWC):设置为
0,以便在R/W后没有暂停 –清除状态标志的初始值(开始、活动、完成):设置为零 •
开始第一次传输(设置Start=1)并等待传输完成(Start=
0,ACTIVE=0) •循环:未设置通道的完成状态时: -开始下一次传输(设置Start=1)并等待传输完成(Start=
0,ACTIVE=0) •清除通道的完成状态位 NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 19/71 2.4.3代码 2.4.3.1main.c #include"S32K144.h"/*IncludeperipheraldeclarationsS32K144*/#include"dma.h"#include"clocks_and_modes.h" 软件示例 voidWDOG_disable(void){WDOG->CNT=0xD928C520;/*Unlockwatchdog*/WDOG->TOVAL=0x0000FFFF;/*Maximumtimeoutvalue*/WDOG->CS=0x00002100;/*Disablewatchdog*/ } intmain(void) {WDOG_disable();SOSC_init_8MHz();SPLL_init_160MHz();NormalRUNmode_80MHz(); /*Initializesystemoscillatorfor8MHzxtal*//*InitializeSPLLto160MHzwith8MHzSOSC*/ /*Initclocks:80MHzSPLL&core,40MHzbus,20MHzflash*/ DMA_init();DMA_TCD_init(); /*InitDMAcontroller*//*InitDMATransferControlDescriptor(s)*/ DMA->SSRT=0; /*Setchan0STARTbittoinitiatefirstminorloop*/ while(((DMA->TCD[0].CSR>>DMA_TCD_CSR_START_SHIFT)&1)|/*WaitforSTART=0*/ ((DMA->TCD[0].CSR>>DMA_TCD_CSR_ACTIVE_SHIFT)&1)){}/*andACTIVE=0*/ /*Nowminorlooppleted*/ while(!
((DMA->TCD[0].CSR>>DMA_TCD_CSR_DONE_SHIFT)&1)){/*LooptillDONE=1*/ /*Placebreakpointatnextinstruction&observeexpressionsTCD0_Source,TCD0_Dest*/ DMA->SSRT=0; /*Setchan0STARTbittoinitiatenextminorloop*/ while(((DMA->TCD[0].CSR>>DMA_TCD_CSR_START_SHIFT)&1)|/*WaitforSTART=0*/ ((DMA->TCD[0].CSR>>DMA_TCD_CSR_ACTIVE_SHIFT)&1)){}/*andACTIVE=0*/ /*Nowminorlooppleted*/ } DMA->TCD[0].CSR&=~(DMA_TCD_CSR_DONE_MASK);/*ClearDONEbit*/ while
(1){}} /*Waitforever*/ NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 20/71 软件示例 2.4.3.2DMA.c #include"S32K144.h"/*includeperipheraldeclarationsS32K144*/ #include"dma.h" uint8_tTCD0_Source[]={"HelloWorld"}; /*TCD0source(11bytestring)*/ uint8_tvolatileTCD0_Dest=0; /*TCD0destination(1byte)*/ voidDMA_init(void){ /*Thisisaninitializationplaceholderfor:*/ /*
1.EnablingDMAMUXclockPCC_PCCn[PCC_DMAMUX_INDEX](notneededwhenSTARTbitused)*/ /*
2.EnablingdesiredchannelsbysettingERQbit(notneededwhenSTARTbitused)*/ } voidDMA_TCD_init(void){ /*TCD0:Transfersstringtoasinglememorylocation*/ DMA->TCD[0].SADDR=DMA_TCD_SADDR_SADDR((uint32_tvolatile)&TCD0_Source);/*Src*/DMA- >TCD[0].SOFF=DMA_TCD_SOFF_SOFF
(1);/*Srcaddradd1byteaftertransfer*/DMA- >TCD[0].ATTR=DMA_TCD_ATTR_SMOD
(0)|/*Srcmodulofeaturenotused*/ DMA_TCD_ATTR_SSIZE
(0)|/*Srcread2**0=1bytepertransfer*/ DMA_TCD_ATTR_DMOD
(0)|/*Destmodulofeaturenotused*/ DMA_TCD_ATTR_DSIZE
(0);/*Destwrite2**0=1bytepertrans.*/ DMA->TCD[0].NBYTES.MLNO=DMA_TCD_NBYTES_MLNO_NBYTES
(1);/*Transfer1byte/minorloop*/ DMA->TCD[0].SLAST =DMA_TCD_SLAST_SLAST(-11);/*Srcaddrchangeaftermajorloop*/ DMA->TCD[0].DADDR =DMA_TCD_DADDR_DADDR((uint32_tvolatile)&TCD0_Dest);/*Dest.*/ DMA->TCD[0].DOFF =DMA_TCD_DOFF_DOFF
(0); /*Nodestadroffsetaftertransfer*/ DMA->TCD[0].CITER.ELINKNO=DMA_TCD_CITER_ELINKNO_CITER(11)|/*11minorloopiterations*/ DMA_TCD_CITER_ELINKNO_ELINK
(0);/*Nominorloopchanlink*/ DMA->TCD[0].DLASTSGA=DMA_TCD_DLASTSGA_DLASTSGA
(0);/*Nodestchgaftermajorloop*/ DMA->TCD[0].CSR=DMA_TCD_CSR_START
(0)|/*ClearSTARTstatusflag*/ DMA_TCD_CSR_INTMAJOR
(0)|/*NoIRQaftermajorloop*/ DMA_TCD_CSR_INTHALF
(0) |/*NoIRQafter1/2majorloop*/ DMA_TCD_CSR_DREQ
(1) |/*Disablechanaftermajorloop*/ DMA_TCD_CSR_ESG
(0) |/*DisableScatterGather*/ DMA_TCD_CSR_MAJORELINK
(0)|/*Nomajorloopchanlink*/ DMA_TCD_CSR_ACTIVE
(0) |/*ClearACTIVEstatusflag*/ DMA_TCD_CSR_DONE
(0) |/*ClearDONEstatusflag*/ DMA_TCD_CSR_MAJORLINKCH
(0)|/*Chan#ifmajorloopchlink*/ DMA_TCD_CSR_BWC
(0); /*NoeDMAstallsafterR/W*/ DMA->TCD[0].BITER.ELINKNO=DMA_TCD_BITER_ELINKNO_BITER(11)|/*Initialiterationcount*/ DMA_TCD_BITER_ELINKNO_ELINK
(0);/*Nominorloopchanlink*/} 2.4.3.3clocks_and_modes.cSeecodeinclocks_and_modes.coftheHelloWorld+Clockexample. NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 21/71 2.5TimedI/O(FTM) 软件示例 2.5.1描述 摘要:本示例使用Flex定时器模块(FTM)执行以下常见数字I/O功能:•边缘对齐脉冲宽度调制(EPWM):1Hz,低25%,高75%•输出比较(OC):每100毫秒切换一次输出(10MHz切换产生5MHz频率)•输入捕获(IC):捕获输入的上升或下降沿时间 FTM中的所有通道共享一个用于I/O功能的通用16位计数器。
S32K144EVB XTAL8MHz S32K144Clocks SYS_CLK(80MHz)SOSCDIV1_CLK(8MHz) PCC_FLEXTMR0clockselect FTM0 Ext.clockSYS_CLKFixedfreqclkNoclock MUX Prescaleby2PR(128) Moduleclock(SYS_CLK,80MHz) CLKS= Ext.clock(8MHz) FTMCounter:countsto62500(1second) Channel0:10HzOutputCompare Channel1:1HzEdge-AlignedPulseWidthMod. Channel6:InputCapture PTD15 RedLED GreenLED J22 PTD164 PTE8
8
6.定时I/O示例框图 要测量输入捕获时间,请将导线从J2引脚8连接到引脚4或引脚
2。
NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 22/71 软件示例 2.5.2 设计 2.5.2.1信道模式选择 通道模式通过整个FTM模块和单个通道的寄存器中的设置进行配置。
下表显示了用于本示例中实现的通道模式的设置。

6.FTM信道模式的定时I/O示例所需寄存器位字段设置 ModuleRegistersSettings1 ChannelRegistersSettings Mode Configuration SC COMBINECOMBINECOMBINE CnSC CnSC [CPWMS][DECAPENx][MCOMBINEx][COMBINEx][MSnB:MSnB][ELSnB:ELSnA]
0 0
0 00 11 InputCaptureCaptureonrisingor fallingedge
0 0
0 0 01 01 Output Toggleonoutput Compare match
0 0
0 1X X1 Edge-AlignedLow-truepulses PWM (setonoutput match) 1“x”inthebitfieldisanumberthatmapstoapairofchannels.Ifx=0,itappliestochannels0,1;x=2,channels2,3;etc. 2.5.2.2结果输出波形下面的波形显示了1Hz时的PWM,占空比为75%,输出比较为10Hz。
NXPSemiconductors Figure7.FTMexampleoutputwaveformsS32K1xxSeriesCookbook,Rev.5,December2020 23/71 2.5.2.3设计步骤•禁用看门狗•系统时钟:初始化8MHz的SOSC,初始化80MHz的sysclk,初始化80MHz的运行模式•初始化FTM0。
输入时钟源应为8MHzSOSCDIV1_时钟:—禁用对FTM0寄存器的写保护以允许配置—控制:—按128(8MHz/128=62500Hz)预刻度时钟源—启用通道0、1作为输出—不使用过滤或中断—PWM配置为递增计数(CPWMS=0)—时钟源=无(初始化后将启动时钟/计数器)—初始化模式,极性设置:CPWMS、DECAPEN、MCOMBINE、联合收割机,极性=0—计数器计数值=62500(1秒周期)•将FTM0通道0初始化为输出比较,每100毫秒切换一次匹配:—为输出比较模式配置MSB:MSA、ELSB:ELSA—将初始比较值设置为6250(100毫秒)—将极性设置为活动高•将FTM0通道1初始化为EPWM,1Hz,75%占空比:—为PWM模式配置MSB:MSA、ELSB:ELSA—设置75%占空比的初始比较值•将FTM0通道6初始化为输入捕获,任一边缘:—为输入捕获模式配置MSB:MSA、ELSB:ELSA•初始化FTM0的端口引脚:—启用端口D和端口E模块的时钟—PTD15:FTM0通道0-输出比较-连接至红色LED—PTD16:FRM0通道1-PWM-连接到绿色LED—PTE8:FTM0通道6-输入捕获•启动FTM0计数器•环路:—如果设置了输出比较匹配标志:—输出引脚切换(硬件自动)—更新下一个100毫秒的比较值(将6250添加到当前计数)—如果设置了输入捕获标志,则清除标志和读取计时器:—清晰的旗帜—存储以前的捕获值—读取当前捕获值 NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 24/71 —计算先前和当前捕获值的增量 软件示例 2.5.3代码 2.5.3.1main.c #include"S32K144.h" /*includeperipheraldeclarationsS32K144*/ #include"clocks_and_modes.h" #include"FTM.h" voidPORT_init(void){PCC->PCCn[PCC_PORTD_INDEX]|=PCC_PCCn_CGC_MASK;PCC->PCCn[PCC_PORTE_INDEX]|=PCC_PCCn_CGC_MASK;PORTE->PCR[8]|=PORT_PCR_MUX
(2);PORTD->PCR[15]|=PORT_PCR_MUX
(2);PORTD->PCR[16]|=PORT_PCR_MUX
(2); } /*EnableclockforPORTD*//*EnableclockforPORTE*//*PortE8:MUX=ALT2,FTM0CH6*//*PortD15:MUX=ALT2,FTM0CH0*//*PortD16:MUX=ALT2,FTM0CH1*/ voidWDOG_disable(void){WDOG->CNT=0xD928C520;WDOG->TOVAL=0x0000FFFF;WDOG->CS=0x00002100; } /*Unlockwatchdog*//*Maximumtimeoutvalue*//*Disablewatchdog*/ intmain(void){ WDOG_disable(); /*DisableWDOG*/ SOSC_init_8MHz(); /*Initializesystemoscillatorfor8MHzxtal*/ SPLL_init_160MHz(); /*InitializeSPLLto160MHzwith8MHzSOSC*/ NormalRUNmode_80MHz();/*Initclocks:80MHzSPLL&core,40MHzbus,20MHzflash*/ FTM0_init(); /*InitFTM0*/ FTM0_CH0_OC_init();/*InitFTM0CH0,redLED*/ FTM0_CH1_PWM_init();/*InitFTM0CH1,greenLED*/ FTM0_CH6_IC_init();/*InitFTM0CH6,j2-8*/ PORT_init(); /*Configureports*/ start_FTM0_counter();/*StartFTM0counter*/ for(;;){ FTM0_CH0_pare();/*Ifparematch:*/ /*Pintoggles(automaticallybyhardware)*/ /*Clearflag8*/ /*Reloadtimer*/ FTM0_CH6_input_capture();/*Ifinputcaptured:clearflag,readtimer*/} NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 25/71 2.5.3.2FTM.c #include"S32K144.h"/*includeperipheraldeclarationsS32K144*/#include"FTM.h"uint16_tCurrentCaptureVal=0;uint16_tPriorCaptureVal=0;uint16_tDeltaCapture=0; 软件示例 voidFTM0_init(void){ PCC->PCCn[PCC_FLEXTMR0_INDEX]&=~PCC_PCCn_CGC_MASK;/*Ensureclkdisabledforconfig*/ PCC->PCCn[PCC_FLEXTMR0_INDEX]|=PCC_PCCn_PCS(0b001)/*ClockSrc=1,8MHzSOSCDIV1_CLK*/ |PCC_PCCn_CGC_MASK;/*EnableclockforFTMregs*/ FTM0->MODE|=FTM_MODE_WPDIS_MASK;/*Writeprotecttoregistersdisabled(default)*/ FTM0->SC=0x00030007; /*EnablePWMchannel0output*/ /*EnablePWMchannel1output*/ /*TOIE(TimerOverflowInterruptEna)=0(default)*/ /*CPWMS(CenteralignedPWMSelect)=0(default,upcount)*/ /*CLKS(Clocksource)=0(default,noclock;FTMdisabled)*/ /*PS(Prescalerfactor)=
7.Prescaler=128*/ FTM0->COMBINE=0x00000000;/*FTMmodesettingsused:DECAPENx,MCOMBINEx,COMBINEx=0*/ FTM0->POL=0x00000000;/*Polarityforallchannelsisactivehigh(default)*/ FTM0->MOD=62500-1; /*FTM1counterfinalvalue(usedforPWMmode)*/ /*FTM1Period=MOD-CNTIN+0x0001~=62500ctrclks*/ /*8MHz/128=62.5kHz->ticks->1Hz*/ } voidFTM0_CH0_OC_init(void){FTM0->CONTROLS[0].CnSC=0x00000014;/*FTM0ch0:OutputCompare,toggleoutputonmatch*//*CHIE(ChanInterruptEna)=0(default)*//*MSB:MSA(chanModeSelect)=0b01,OutputCompare*//*ELSB:ELSA(chanEdgeorLevelSelect)=0b01,toggle*/FTM0->CONTROLS[0].CnV=6250;/*FTM0ch0CompareValue=6250clks,100mstoggle*/FTM0>POL&=~FTM_POL_POL0_MASK;/*FTM0ch0polarity=0(Default,activehigh)*/ } voidFTM0_CH1_PWM_init(void){ FTM0->CONTROLS[1].CnSC=0x00000028;/*FTM0ch1:edge-alignedPWM,lowtruepulses*/ /*CHIE(ChanInterruptEna)=0(default)*/ /*MSB:MSA(chanModeSelect)=0b10,EdgeAlignPWM*/ /*ELSB:ELSA(chanEdge/LevelSelect)=0b10,lowtrue*/ FTM0->CONTROLS[1].CnV=46875; /*FTM0parevalue(~75%dutycycle)*/ } NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 26/71 软件示例 voidFTM0_CH6_IC_init(void){FTM0->CONTROLS[6].CnSC=0x0000000C;/*FTM0ch6:InputCapturerisingorfallingedge*//*CHIE(ChanInterruptEna)=0(default)*//*MSB:MSA(chanModeSelect)=0b00,InputCapture*//*ELSB:ELSA(chEdge/LevelSelect)=0b11,riseorfall*/ } voidFTM0_CH0_pare(void){ if(1==((FTM0->CONTROLS[0].CnSC&FTM_CnSC_CHF_MASK)>>FTM_CnSC_CHF_SHIFT)){ /*Ifchanflagisset*/ FTM0->CONTROLS[0].CnSC&=~FTM_CnSC_CHF_MASK;/*Clearflag:readregthensetCHF=0*/ if(FTM0->CONTROLS[0].CnV==56250){ /*Ifcountatlastvaluebeforeend,*/ FTM0->CONTROLS[0].CnV=0; /*parevalue:to0*/ } else{ FTM0->CONTROLS[0].CnV=FTM0->CONTROLS[0].CnV+6250; /*parevalue:add6250tocurrentvalue*/ } } } voidFTM0_CH6_input_capture(void){ if(1==((FTM0->CONTROLS[6].CnSC&FTM_CnSC_CHF_MASK)>>FTM_CnSC_CHF_SHIFT)){ /*Ifchanflagisset*/ FTM0->CONTROLS[6].CnSC&=~FTM_CnSC_CHF_MASK;/*Clearflag:readregthensetCHF=0*/ PriorCaptureVal=CurrentCaptureVal; /*Recordvalueofpriorcapture*/ CurrentCaptureVal=FTM0->CONTROLS[6].CnV; /*Recordvalueofcurrentcapture*/ DeltaCapture=CurrentCaptureVal-PriorCaptureVal; /*Willbe6250clocks(100msec)ifconnectedtoFTM0CH0*/ } } voidstart_FTM0_counter(void){FTM0->SC|=FTM_SC_CLKS
(3);/*StartFTM0counterwithclksource=externalclock(SOSCDIV1_CLK)*/ } 2.5.3.3clocks_and_modes.cSeecodeinclocks_and_modes.coftheHelloWorld+Clockexample. NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 27/71 2.6ADC-SW触发器 软件示例 2.6.1描述 摘要:ADC初始化为一次性转换的软件触发器转换两个通道。
每个转换都需要自己的软件触发器。
一个通道(AD12)连接到S32K144评估板上的电位计另一个与VREFSH相连。
结果按0至5000mV的比例缩放。

8.ADC示例框图 在评估板上,根据下表使用三个LED指示转换结果范围。

7.来自电位计的ADC示例输入电压的LED颜色 Scaledconversionresult3750-5000mV2500-3750mV1250-2500mV0to1250mV LEDilluminatedRedGreenBlueNone NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 28/71 软件示例 2.6.2设计 此简单示例中不包括ADC校准。
因此,结果可能低于规定的精度。
初始化校准机构的步骤见参考手册ADC章节的校准功能部分。
•禁用看门狗•系统时钟:初始化8MHz的SOSC,初始化80MHz的sysclk,初始化80MHz的运行模式•初始化端口引脚:—启用端口D的时钟—PTD0:GPIO输出-连接到蓝色LED—PTD15:GPIO输出-连接至红色LED—PTD16:GPIO输出-连接到绿色LED—(不复位,模拟管脚无需配置。
)•初始化ADC:—选择SOSCDIV2_CLK作为功能时钟,并将其启用到模块—禁用模块并禁用来自模块的中断请求(重置默认状态)—使用SOSCDIV2_CLK(除以1)为12位转换配置ADC—配置13个ADCK时钟周期的采样时间(重置默认值)—选择软件触发器进行转换,无比较功能,无DMA,并使用默认电压参考引脚-外部引脚 VREFH和VREFL(重置默认值)—禁用连续转换(因此每个软件触发器有一个转换)、禁用硬件平均、禁用校准序列启动•环路:—为通道12发出ADC转换命令,该通道连接到NXP评估板上的电位计(将ADC_SC1[0]用于软 件触发器。
)—等待转换完成标志。
转换完成后:—读取结果并缩放至0至5000mV(所有软件触发器的结果为ADC_R[0])—根据电压范围点亮LED—发出ADC转换命令以读取通道29、ADC高参考电压(使用ADC_SC1[0]作为软件触发 器。
)—等待转换完成标志。
转换完成后:—读取结果并缩放至0至5000mV(所有软件触发器的结果为ADC_R[0]) NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 29/71 软件示例 2.6.3代码 2.6.3.1main.c #include"S32K144.h"/*includeperipheraldeclarationsS32K144*/#include"clocks_and_modes.h"#include"ADC.h" #definePTD1515/*REDLED*/#definePTD1616/*GREENLED*/#definePTD00/*BLUELED*/ uint32_tadcResultInMv_pot=0;uint32_tadcResultInMv_Vrefsh=0; voidPORT_init(void){PCC->PCCn[PCC_PORTD_INDEX]|=PCC_PCCn_CGC_MASK;/*EnableclockforPORTD*/PORTD->PCR[PTD0]=0x00000100;/*PortD0:MUX=GPIO*/PORTD->PCR[PTD15]=0x00000100;/*PortD15:MUX=GPIO*/PORTD->PCR[PTD16]=0x00000100;/*PortD16:MUX=GPIO*/ PTD->PDDR|=1<PDDR|=1<PDDR|=1<CNT=0xD928C520;WDOG->TOVAL=0x0000FFFF;WDOG->CS=0x00002100; } /*Unlockwatchdog*//*Maximumtimeoutvalue*//*Disablewatchdog*/ intmain(void) { WDOG_disable(); /*DisableWDOG*/ SOSC_init_8MHz(); /*Initializesystemoscillatorfor8MHzxtal*/ SPLL_init_160MHz();/*InitializeSPLLto160MHzwith8MHzSOSC*/ NormalRUNmode_80MHz();/*Initclocks:80MHzsysclk&core,40MHzbus,20MHzflash*/ PORT_init(); /*Initportclocksandgpiooutputs*/ ADC_init(); /*InitADCresolution12bit*/ NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 30/71 软件示例 for(;;){convertAdcChan(12);while(plete()==0){}adcResultInMv_pot=read_adc_chx(); /*ConvertChannelAD12topotonEVB*//*Waitforpleteflag*/ /*Getchannel'sconversionresultsinmv*/ if(adcResultInMv_pot>3750){ /*Ifresult>3.75V*/ PTD->PSOR|=1<PCOR|=1<2500){/*Ifresult>3.75V*/ PTD->PSOR|=1<PCOR|=1<1250){ /*Ifresult>3.75V*/ PTD->PSOR|=1<PCOR|=1<PSOR|=1<PCCn[PCC_ADC0_INDEX]&=~PCC_PCCn_CGC_MASK;PCC->PCCn[PCC_ADC0_INDEX]|=PCC_PCCn_PCS
(1);PCC->PCCn[PCC_ADC0_INDEX]|=PCC_PCCn_CGC_MASK; /*DisableclocktochangePCS*//*PCS=1:SelectSOSCDIV2*//*EnablebusclockinADC*/ ADC0->SC1[0]=0x00001F;ADC0->CFG1=0x000000004;ADC0->CFG2=0x00000000C;ADC0->SC2=0x00000000; ADC0->SC3=0x00000000;} /*ADCH=1F:Moduleisdisabledforconversions*//*AIEN=0:Interruptsaredisabled*//*ADICLK=0:Inputclk=ALTCLK1=SOSCDIV2*//*ADIV=0:Prescaler=1*//*MODE=1:12-bitconversion*//*SMPLTS=12(default):sampletimeis13ADCclks*//*ADTRG=0:SWtrigger*//*ACFE,ACFGT,ACREN=0:Comparefuncdisabled*//*DMAEN=0:DMAdisabled*//*REFSEL=0:Voltagereferencepins=VREFH,VREEFL*//*CAL=0:Donotstartcalibrationsequence*//*ADCO=0:Oneconversionperformed*//*AVGE,AVGS=0:HWaveragefunctiondisabled*/ voidconvertAdcChan(uint16_tadcChan){ADC0->SC1[0]&=~ADC_SC1_ADCH_MASK;ADC0->SC1[0]=ADC_SC1_ADCH(adcChan); } /*ForSWtriggermode,SC1[0]isused*//*ClearpriorADCHbits*/ /*InitiateConversion*/ uint8_tplete(void){return((ADC0->SC1[0]&ADC_SC1_COCO_MASK)>>ADC_SC1_COCO_SHIFT);/*Waitpletion*/ } uint32_tread_adc_chx(void) { uint16_tadc_result=0; adc_result=ADC0->R[0]; /*ForSWtriggermode,R[0]isused*/ return(uint32_t)((5000*adc_result)/0xFFF);/*Convertresulttomvfor0-5Vrange*/} 2.6.3.3clocks_and_modes.cSeecodeinclocks_and_modes.coftheHelloWorld+Clockexample. NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 32/71 软件示例 2.7UART 2.7.1描述 摘要:此示例执行一个简单的UART9600波特传输到PC上的COM端口。
未实现FIFO、中断和DMA。
开放式SDA接口可在评估板上使用,其中UART信号传输至USB接口,USB接口可连接至具有终端仿真程序(如PUTTY、TeraTerm或其他软件)的PC。
S32K144EVB XTAL8MHz S32K144Clocks BUS_CLK(40MHz)SOSCDIV2_CLK(8MHz) PCC_LPUART_1clockselect LPUART1 Functionalclock(8MHz) Divideby16xSBR(16x5=832) Moduleclock(BUS_CLK,40MHz) Baudrateclock(9600Hz) DATATxFIFOShiftRegister RxFIFODATA PTC6UART1_RXPTC7UART1_TX NXPSemiconductors LevelshiftersandOpenSDAInterface USB PCwithterminalemulatorsoftware 图
9.UART示例框图 S32K1xxSeriesCookbook,Rev.5,December2020 33/71 软件示例 可以使用PC上的串口调试助手,如PuTTY。
要配置PuTTY,请执行以下操作:
1.确定要使用的COM端口:-打开Windows设备管理器-扩展端口(COM和LPT)-注意哪个COM端口用于OpenSDA(示例:COM3)
2.设置putty。

3.配置会话对话框:-会话-连接类型:单击串行按钮-会话-串行线:输入COM端口(示例:COM3)-会话-速度:输入所需的波特率(本例中为9600)
4.展开连接组(如果未展开)并选择串行对话框:-连接-串行:验证COM端口号是否正确-SONECTION-串行:在本例中设置速度(波特率):9600-连接-串行:根据需要,设置数据位数、奇偶校验、停止位、流量控制
5.点击“打开”按钮打开串行调试窗口。
2.7.2设计 此基本示例中不包括溢出处理。
因此,如果接收数据的速度比软件处理数据的速度快,则会丢失一些数据。
如果这是一个问题,可以将溢出处理逻辑添加到应用程序中。
•禁用看门狗•系统时钟:初始化8MHz的SOSC,初始化80MHz的sysclk,初始化80MHz的运行模式•初始化端口引脚:—启用端口C模块的时钟—PTC6、PTC7:配置LPUART1\URX、LPUART1\UTX•初始化LPUART1:—启用SOSC_DIV2_时钟的时钟源—配置波特率:9600波特,一个停止位,8位字符—未启用中断、DMA或匹配功能—配置LPUART1控件:启用发射机、接收机、无奇偶校验、8位字符•传输两个字符串:—要发送的每个字符的循环:如果设置了传输数据就绪状态位,则将字符写入数据寄存器•循环回显接收到的字符:—传输提示字符(“>”)—等待设置RDRF标志,然后读取字符—传回读字符 NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 34/71 软件示例 2.7.3 代码 2.7.3.1main.c #include"S32K144.h"/*includeperipheraldeclarationsS32K144*/#include"clocks_and_modes.h"#include"LPUART.h" chardata=0; voidPORT_init(void){ PCC->PCCn[PCC_PORTC_INDEX]|=PCC_PCCn_CGC_MASK;/*EnableclockforPORTC*/ PORTC->PCR[6]|=PORT_PCR_MUX
(2); /*PortC6:MUX=ALT2,UART1TX*/ PORTC->PCR[7]|=PORT_PCR_MUX
(2); /*PortC7:MUX=ALT2,UART1RX*/ } voidWDOG_disable(void){WDOG->CNT=0xD928C520;WDOG->TOVAL=0x0000FFFF;WDOG->CS=0x00002100; } /*Unlockwatchdog*//*Maximumtimeoutvalue*//*Disablewatchdog*/ intmain(void){ WDOG_disable();SOSC_init_8MHz();SPLL_init_160MHz();RUNmode_80MHz();PORT_init(); /*DisableWDGO*//*Initializesystemoscillatorfor8MHzxtal*/ /*InitializeSPLLto160MHzwith8MHzSOSC*//*Initclocks:80MHzSPLL&core,40MHzbus,20MHzflash*//*Configureports*/ LPUART1_init(); /*InitializeLPUART@9600*/ LPUART1_transmit_string("RunningLPUARTexample\n\r"); /*Transmitcharstring*/ LPUART1_transmit_string("Inputcharactertoecho...\n\r");/*Transmitcharstring*/ for(;;){ LPUART1_transmit_char('>'); /*Transmitpromptcharacter*/ LPUART1_receive_and_echo_char();/*Waitforinputchar,receive&echoit*/ } } NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 35/71 2.7.3.2LPUART.c #include"S32K144.h"/*includeperipheraldeclarationsS32K144*/#include"LPUART.h" 软件示例 voidLPUART1_init(void)/*Init.summary:9600baud,1bit,8bitformat,noparity*/ { PCC->PCCn[PCC_LPUART1_INDEX]&=~PCC_PCCn_CGC_MASK;/*Ensureclkdisabledforconfig*/ PCC->PCCn[PCC_LPUART1_INDEX]|=PCC_PCCn_PCS(0b001)/*ClockSrc=1(SOSCDIV2_CLK)*/ |PCC_PCCn_CGC_MASK; /*EnableclockforLPUART1regs*/ LPUART1->BAUD=0x0F000034; /*Initializefor9600baud,1:*//*SBR=52(0x34):bauddivisor=8M/9600/16=~52*//*OSR=15:Oversamplingratio=15+1=16*//*SBNS=0:Onebit*//*BOTHEDGE=0:receiversamplesonlyonrisingedge*//*M10=0:RxandTxuse7to9bitdatacharacters*//*RESYNCDIS=0:Resyncduringrec'ddatawordsupported*//*LBKDIE,RXEDGIE=0:interruptsdisable*//*TDMAE,RDMAE,TDMAE=0:DMArequestsdisabled*//*MAEN1,MAEN2,MATCFG=0:Matchdisabled*/ LPUART1->CTRL=0x000C0000;/*Enabletransmitter&receiver,noparity,8bitchar:*//*RE=1:Receiverenabled*//*TE=1:Transmitterenabled*//*PE,PT=0:Nohwparitygenerationorchecking*//*M7,
M,R8T9,R9T8=0:8-bitdatacharacters*//*DOZEEN=0:LPUARTenabledinDozemode*/ /*ORIE,NEIE,FEIE,PEIE,TIE,TCIE,RIE,ILIE,MA1IE,MA2IE=0:noIRQ*//*TxDIR=0:TxDpinisinputifinsingle-wiremode*//*TXINV=0:TRansmitdatanotinverted*//*RWU,WAKE=0:normaloperation;rcvrnotinstatndby*//*IDLCFG=0:oneidlecharacter*//*ILT=0:Idlecharbitcountstartsafterstartbit*//*SBK=0:Normaltransmitteroperation-nobreakchar*//*LOOPS,RSRC=0:noloopback*/ } NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 36/71 软件示例 voidLPUART1_transmit_char(charsend){/*FunctiontoTransmitsingleChar*/ while((LPUART1->STAT&LPUART_STAT_TDRE_MASK)>>LPUART_STAT_TDRE_SHIFT==0); /*Waitfortransmitbuffertobeempty*/ LPUART1->DATA=send; /*Senddata*/ } voidLPUART1_transmit_string(chardata_string[]){/*FunctiontoTransmitwholestring*/ uint32_ti=0; while(data_string[i]!
='\0'){ /*Sendcharsoneatatime*/ LPUART1_transmit_char(data_string[i]); i++; } } charLPUART1_receive_char(void){/*FunctiontoReceivesingleChar*/ charreceive; while((LPUART1->STAT&LPUART_STAT_RDRF_MASK)>>LPUART_STAT_RDRF_SHIFT==0); /*Waitforreceivedbuffertobefull*/ receive=LPUART1->DATA; /*Readreceiveddata*/ returnreceive; } voidLPUART1_receive_and_echo_char(void){/*Functiontoechoreceivedcharback*/ charsend=LPUART1_receive_char(); /*ReceiveChar*/ LPUART1_transmit_char(send); /*Transmitsamecharbacktothesender*/ LPUART1_transmit_char('\n'); /*Newline*/ } 2.7.3.3clocks_and_modes.cSeecodeinclocks_and_modes.coftheHelloWorld+Clockexample. NXPSemiconductors S32K1xxSeriesCookbook,Rev.5,December2020 37/71 2.8SPI 软件示例 2.8.1描述 摘要:使用FIFO执行简单的LPSPI传输,可以提高吞吐量。
初始化后,以1Mbps的速率传输16位帧。
软件将轮询标志,而不是使用中断和DMA。
SBC的状态寄存器被读取为变量LPSPI1_16bits_read。
对于UJA1169,通常读取的值为0xFDEF。
S32K144EVB注:该示例使用LPSP1和外围芯片Select3,该芯片连接到收发器UGA1169TK/F1。
要为SBC供电,请将外部12V电源连接至EVB,并连接上的针脚1-2跳线J107。
USB电缆仍然可以连接到EVB,以便继续调试。
如果SBC未通电,LPSPI数据将全部为零。
S32K144EVB XTAL8MHz S32K144Clocks BUS_CLK(40MHz)SPLLDIV2_CLK(40MHz) PCC_LPSPI_1clockselect LPSPI1(Master) FunctionalclockSPLLDIV2_CLK(40M

标签: #后缀名 #文件夹 #文件夹 #圆弧 #网页 #网页 #道具 #cad