目录(共10页精讲,手把手教你S32K3从入门到精通)
实现的软件架构:基于Drivers层(以往的SDK)
前期准备工作:
1 创建一个FREERTOS工程
2 点亮评估板S32K312EVB-Q172中D13 LED灯
2.1 S32K312EVB-Q172原理图中D13 LED外设摘录
2.2 MCU Pin的GPIO配置
2.3 举例:如何使用驱动
结尾
实现的软件架构:基于Drivers层(以往的SDK)
前期准备工作:
评估板: NXP S32K312EVB-Q172通用开发板 S32K312EVB-Q172通用开发板 | NXP 半导体
芯片封装Package:S32K312_172HDQFP
开发&编译环境: S32 Design Studio for S32 Platform 3.5 S32 Design Studio | NXP 半导体
RTD(Real-Time Driver实时驱动): S32K3_S32M27x Real-Time Drivers AUTOSAR R21-11 Version 4.0.0 & SW32K3 FreeRTOS 10.6.0 version 4.0.0 实时驱动(RTD) | NXP 半导体
1 创建一个FREERTOS工程
RTD(Real-Time Driver实时驱动)版本:
S32K3_S32M27x Real-Time Drivers AUTOSAR R21-11 Version 4.0.0
SW32K3 FreeRTOS 10.6.0 version 4.0.0
参考博文《【S32DS RTD实战】-1.4-基于S32K3创建配置FreeRTOS工程-控制GPIO点亮LED_sw32k3_freertos-CSDN博客https://blog.csdn.net/qfmzhu/article/details/135142529》,配置一个FREERTOS工程。
2 点亮评估板S32K312EVB-Q172中D13 LED灯
2.1 S32K312EVB-Q172原理图中D13 LED外设摘录
D13 LED灯与MCU Pin的映射关系:
PTA29 :RGBLED0_RED
PTA30 :RGBLED0_GREEN
PTA31 :RGBLED0_BLUE
2.2 MCU Pin的GPIO配置
在引脚视图中,将PTA29,PTA29,PTA31都配置为GPIO:Output,Initial Value都是LOW,并给这3个Pin添加标签:RGBLED0_RED,RGBLED0_GREEN,RGBLED0_BLUE。
在外设视图中,在Siul2_Port -- > PortConfigSet -- > PortContainer -- > PortPin路径下,添加3个Pin的配置:
PortPin_PTA29_RGBLED0_RED
PortPin_PTA30_RGBLED0_GREEN
PortPin_PTA31_RGBLED0_BLUE
注意:
在PortPin Mscr中填入Pin编号即可。
该Pin必须在引脚视图中已配置。
PortPin Mscr编号规则:
PTA的起始编号是0 * 32 = 0,PTAn对应Pin的编号为0 + n;
PTB的起始编号是1 * 32 = 32,PTBn对应Pin的编号为32 + n;
PTC的起始编号是2 * 32 = 64,PTCn对应Pin的编号为64 + n;
PTD的起始编号是3 * 32 = 96,PTDn对应Pin的编号为96 + n;
PTE的起始编号是4 * 32 = 128,PTEn对应Pin的编号为128 + n;
上述配置完成后,点击“更新代码”,生成S32K3的驱动代码。
2.3 举例:如何使用驱动
在FreeRTOS工程里的LEDTask任务函数中,调用API Siul2_Dio_Ip_SetPins和Siul2_Dio_Ip_ClearPins,间隔1秒分别点亮PTA29_RGBLED0_RED,PTA30_RGBLED0_GREEN,PTA31_RGBLED0_BLUE灯。
附录:main.c源码
/******************************************************************************
* *
* FreeRTOS sample application for RTD on S32 platforms *
* *
* Copyright 2023 NXP *
* *
******************************************************************************/
/* Including necessary configuration files. */
#include "Clock_Ip.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "Siul2_Port_Ip.h"
#include "Siul2_Dio_Ip.h"
#define main_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
SemaphoreHandle_t sem_handle;
/**
* @brief SendTask is used to give the semaphore
* @details SendTask give the semaphore every 1 second
*/
void LEDTask( void *pvParameters )
{
(void)pvParameters;
uint8 LED_Switch_State = 0;
for( ;; )
{
if(LED_Switch_State == 0)
{
LED_Switch_State = 1;
Siul2_Dio_Ip_SetPins(RGBLED0_RED_PORT,1 << RGBLED0_RED_PIN);
Siul2_Dio_Ip_ClearPins(RGBLED0_GREEN_PORT,1 << RGBLED0_GREEN_PIN);
Siul2_Dio_Ip_ClearPins(RGBLED0_BLUE_PORT,1 << RGBLED0_BLUE_PIN);
}
else if(LED_Switch_State == 1)
{
LED_Switch_State = 2;
Siul2_Dio_Ip_ClearPins(RGBLED0_RED_PORT,1 << RGBLED0_RED_PIN);
Siul2_Dio_Ip_SetPins(RGBLED0_GREEN_PORT,1 << RGBLED0_GREEN_PIN);
Siul2_Dio_Ip_ClearPins(RGBLED0_BLUE_PORT,1 << RGBLED0_BLUE_PIN);
}
else
{
LED_Switch_State = 0;
Siul2_Dio_Ip_ClearPins(RGBLED0_RED_PORT,1 << RGBLED0_RED_PIN);
Siul2_Dio_Ip_ClearPins(RGBLED0_GREEN_PORT,1 << RGBLED0_GREEN_PIN);
Siul2_Dio_Ip_SetPins(RGBLED0_BLUE_PORT,1 << RGBLED0_BLUE_PIN);
}
/* Not very exciting - just delay... */
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
/**
* @brief Main function of the example
* @details Initializes the used drivers and uses 1 binary Semaphore and
* 2 tasks to toggle a LED.
*/
int main(void)
{
/* Initialize Clock */
Clock_Ip_StatusType Status_Init_Clock = CLOCK_IP_ERROR;
Status_Init_Clock = Clock_Ip_Init(Clock_Ip_aClockConfig);
if (Status_Init_Clock != CLOCK_IP_SUCCESS)
{
while(1); /* Error during initialization. */
}
/* Initialize all pins using the Port driver */
Siul2_Port_Ip_PortStatusType Status_Init_Port = SIUL2_PORT_ERROR;
Status_Init_Port = Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);
if(Status_Init_Port != SIUL2_PORT_SUCCESS)
{
while(1); /* Error during initialization. */
}
vSemaphoreCreateBinary(sem_handle);
xTaskCreate( LEDTask , ( const char * const ) "LEDTask", configMINIMAL_STACK_SIZE, (void*)0, main_TASK_PRIORITY, NULL );
vTaskStartScheduler();
for( ;; );
return 0;
}
/** @} */
结尾
获取更多“汽车电子资讯”和“工具链使用”,
请关注CSDN博客“汽车电子助手”,做您的好助手。