Multi Source Translation Content

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

Multi Source Translation Content

讨论

排序依据:
The RT speech recognition system based on VIT to obtain weather information 1.  Abstract NXP EdgeReady solution can use RT106/5 S/L/A/F to achieve speech recognition, but the relevant support software libraries for the RT4-bit series are limited to the S/L/A/F series, if you want to use normal RT chips, how to achieve speech recognition functions? NXP officially launched the VIT software package in the SDK, which can support RT1060, RT1160, RT1170, RT600, RT500 to achieve SDK-based speech recognition functions. For the acquisition of weather information, usually customer can connect with a third-party platform or the cloud weather API, using http client method to access directly, the current weather API platforms, you can register it, then call the API directly, so you can use the RT SDK lwip socket client method to call the corresponding weather API, to achieve real-time specific geographical location weather forecast data.     This article will use MIMXRT1060-EVK to implement customer-defined wake-up word(WW) and voice recognition word recognition(VC) based on SDK VIT lib, and LWIP socket client to achieve real-time weather information acquisition in Shanghai, then print it to the terminal, this article mainly use the print to share the weather information, for the sound broadcasts, it also add the simple method to broadcast the fixed sound with mp3 audio data, but for the freely sound broadcast, it may need to use real-time TTS function, which is not added now.     The system block diagram of this document is as follows:   Fig 1 System Block diagram The VIT custom wake-up word of this system is "小恩小恩", and after waking up, one of the following recognition words can be recognized: ”开灯”("Turn on the lights"),“关灯”("Turn off the lights"),”今天天气”("Today's weather"),“明天天气”("Tomorrow's Weather"),“后天天气”("The day after tomorrow's weather"). Turn on the light or Turn off the lights , that is to control  the external LED red light on the EVK board. ”今天天气” gets today’s weather forecast, it is in the following format:                     "date": "2022-05-27",                     "week": "5",                     "dayweather": "阴",                     "nightweather": "阴",                     "daytemp": "28",                     "nighttemp": "21",                     "daywind": "东南",                     "nightwind": "东南",                     "daypower": "≤3",                     "nightpower": "≤3" “明天天气”,“后天天气” are the same format, but it is 1-2 days after the date of today. To get the weather data, the MIMXRT1060-EVK board needs to connect the network to achieve the acquisition of the Gaode Map(restapi.amap.com) Weather API data. 2.  Related preparations 2.1 Weather API Platform     At present, there are many third-party platforms that can obtain weather on the Internet for Chinese, such as: Baidu Intelligent Cloud, Baidu Map API, Huawei cloud platform, Juhe weather, Gaode Map API, and so on. This article tried several platform, the test results found: Baidu intelligent cloud, the number of daily free calls is small, the need for real-time synthesis of AK, SK, cumbersome to call; Baidu Map API needs to upload ID card information; Several others have a similar situation. In the end, the Gaode Map API with convenient registration, many daily calls and relatively full feedback weather data information was selected.     Here, we mainly talk about the Gaode Map API usage, the link is: https://lbs.amap.com/api/webservice/guide/api/weatherinfo Create the account and the API key, then add the relevant parameters to implement the call of the weather API, the application for API Key is as follows: Fig 2 Gaode map API key The following diagram shows the call volume:   Fig 3 Gaode Map API call volume This is the API calling format:   Fig 4 Weather API calling parameters So, the full Gaode Map API link should like this: https://restapi.amap.com/v3/weather/weatherInfo?key=xxxxxxx&city=xxx&extensions=all&output=JSON If need to test the Shanghai weather, city code is 310000. 2.2 Postman test weather API     Postman is an interface testing tool, when doing interface testing, Postman is equivalent to a client, it can simulate various HTTP requests initiated by users, send the request data to the server, obtain the corresponding response results, and verify whether the result data in the response matches the expected value. Postman download link: https://www.postman.com/   After finding the proper weather API platform and the calling link, use the postman do the http GET operation to capture the weather data, refer to the Fig 4, fill the related parameters to the postman: Fig 5 Postman call weather API Send Get command, we can find the weather information in the position 7, the complete all information is: {     "status": "1",     "count": "1",     "info": "OK",     "infocode": "10000",     "forecasts": [         {             "city": "上海市",             "adcode": "310000",             "province": "上海",             "reporttime": "2022-05-27 17:34:12",             "casts": [                 {                     "date": "2022-05-27",                     "week": "5",                     "dayweather": "阴",                     "nightweather": "阴",                     "daytemp": "28",                     "nighttemp": "21",                     "daywind": "东南",                     "nightwind": "东南",                     "daypower": "≤3",                     "nightpower": "≤3"                 },                 {                     "date": "2022-05-28",                     "week": "6",                     "dayweather": "小雨",                     "nightweather": "中雨",                     "daytemp": "24",                     "nighttemp": "20",                     "daywind": "东南",                     "nightwind": "东南",                     "daypower": "≤3",                     "nightpower": "≤3"                 },                 {                     "date": "2022-05-29",                     "week": "7",                     "dayweather": "大雨",                     "nightweather": "小雨",                     "daytemp": "23",                     "nighttemp": "20",                     "daywind": "南",                     "nightwind": "南",                     "daypower": "≤3",                     "nightpower": "≤3"                 },                 {                     "date": "2022-05-30",                     "week": "1",                     "dayweather": "小雨",                     "nightweather": "晴",                     "daytemp": "27",                     "nighttemp": "20",                     "daywind": "北",                     "nightwind": "北",                     "daypower": "≤3",                     "nightpower": "≤3"                 }             ]         }     ] } We can see, it can capture the continuous 4 days information, with this information, we can get the weather information easily. From the postman, we also can see the Get code, like this: Fig 6 postman API HTTP code     With this API which already passed the testing, it can capture the complete weather information, here, we can consider adding the working http API to the MIMXRT1060-EVK code.    2.3 VIT custom commands     From the maestro code of the RT1060 SDK, we can know that the SDK already supports the VIT library, what is VIT?     VIT's full name: Voice Intelligent Technology, the library provides voice recognition services designed to wake up and recognize specific commands, control IOT, and the smart home. Fig 7 VIT system block diagram     In NXP RT1060 SDK code, the generated wake word and command word have been provided and placed in the VIT_Model.h file. If in the customer's project, how to customize the wake word and command word? With the NXP's efforts, we have made a web page form for customers to choose their own command, and then generate the corresponding VIT_Model.h file for code to call. VIT command word generation web page is: https://vit.nxp.com/#/home     Login the NXP account, choose the RT chip partn umber, wakeup word, voice command. Please note, the current supported RT chip is: RT1060,RT1160,RT1170,RT600,RT500 The following is the example for generating wakeup word and voice command:   Fig 8 Custom VIT configuration Fig 9 generated result Download the generated model, you can get VIT_Model_cn.h, open to see the command word information and related model data stored in the const PL_MEM_ALIGN (PL_UINT8 VIT_Model_cn[], VIT_MODEL_ALIGN_BYTES) array, the command word information is as follows: WakeWord supported : " 小恩 小恩 " Voice Commands supported     Cmd_Id : Cmd_Name       0    : UNKNOWN       1    : 开灯       2    : 关灯       3    : 今天 天气       4    : 明天 天气       5    : 后天 天气 Use the RT1060 SDK maestro_record demo to test this custom command result:   Fig 10 Custom Wakeup word and voice command test From the test result, we can see, both the wakeup word and voice command is detected. 3 Software code 3.1 LWIP socket client code capture weather API From chapter 2.2, we have been able to obtain the weather API and through testing, we can successfully achieve weather acquisition, so we need to add relevant commands in combination with the needs of our own system. For the acquisition of the weather API, the lwip code based on the RT1060 SDK is in the form of socket client. The relevant code is as follows: #define PORT 80 #define IP_ADDR "59.82.9.133" uint8_t get_weather[]= "GET /v3/weather/weatherInfo?key=xxx&city=310000&extensions=all&output=JSON HTTP/1.1\r\nHost: restapi.amap.com\r\n\r\n\r\n\r\n"; if (sys_thread_new("weather_main", weathermain_thread, NULL, HTTPD_STACKSIZE, HTTPD_PRIORITY) == NULL) LWIP_ASSERT("main(): Task creation failed.", 0); static void weathermain_thread(void *arg) { static struct netif netif; ip4_addr_t netif_ipaddr, netif_netmask, netif_gw; ethernetif_config_t enet_config = { .phyHandle = &phyHandle, .macAddress = configMAC_ADDR, }; LWIP_UNUSED_ARG(arg); mdioHandle.resource.csrClock_Hz = EXAMPLE_CLOCK_FREQ; IP4_ADDR(&netif_ipaddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3); IP4_ADDR(&netif_netmask, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3); IP4_ADDR(&netif_gw, configGW_ADDR0, configGW_ADDR1, configGW_ADDR2, configGW_ADDR3); tcpip_init(NULL, NULL); netifapi_netif_add(&netif, &netif_ipaddr, &netif_netmask, &netif_gw, &enet_config, EXAMPLE_NETIF_INIT_FN, tcpip_input); netifapi_netif_set_default(&netif); netifapi_netif_set_up(&netif); PRINTF("\r\n************************************************\r\n"); PRINTF(" TCP client example\r\n"); PRINTF("************************************************\r\n"); PRINTF(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&netif_ipaddr)[0], ((u8_t *)&netif_ipaddr)[1], ((u8_t *)&netif_ipaddr)[2], ((u8_t *)&netif_ipaddr)[3]); PRINTF(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&netif_netmask)[0], ((u8_t *)&netif_netmask)[1], ((u8_t *)&netif_netmask)[2], ((u8_t *)&netif_netmask)[3]); PRINTF(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&netif_gw)[0], ((u8_t *)&netif_gw)[1], ((u8_t *)&netif_gw)[2], ((u8_t *)&netif_gw)[3]); PRINTF("************************************************\r\n"); sys_thread_new("weather", weather_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); vTaskDelete(NULL); } static void weather_thread(void *arg) { int sock = -1,rece; struct sockaddr_in client_addr; char* host_ip; ip4_addr_t dns_ip; err_t err; uint32_t *pSDRAM= pvPortMalloc(BUF_LEN);// host_ip = HOST_NAME; PRINTF("host name : %s , host_ip : %s\r\n",HOST_NAME,host_ip); while(1) { sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { PRINTF("Socket error\n"); vTaskDelay(10); continue; } client_addr.sin_family = AF_INET; client_addr.sin_port = htons(PORT); client_addr.sin_addr.s_addr = inet_addr(host_ip); memset(&(client_addr.sin_zero), 0, sizeof(client_addr.sin_zero)); if (connect(sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1) { PRINTF("Connect failed!\n"); closesocket(sock); vTaskDelay(10); continue; } PRINTF("Connect to server successful!\r\n"); write(sock,get_weather,sizeof(get_weather)); while (1) { rece = recv(sock, (uint8_t*)pSDRAM, BUF_LEN, 0);//BUF_LEN if (rece <= 0) break; memcpy(weather_data.weather_info, pSDRAM,1500);//max 1457 } Weather_process(); memset(pSDRAM,0,BUF_LEN); closesocket(sock); vTaskDelay(10000); } }  3.2 VIT detect customer command code    Put the generated VIT_Model_cn.h to the maestro_record folder path:   vit\RT1060_CortexM7\Lib    The specific wake word and voice command related code can be viewed from the code vit_pro.c, mainly involving function is: int VIT_Execute(void *arg, void *inputBuffer, int size) The code is modified as follows, mainly to record the wake and wake word number, for specific function control, the command directly controlled here is the local "开灯:turn on the light", "关灯:turn off the light" command, as for the weather command needs to call the socket client API, so in the main lwip call area combined with the command word recognition number to call: if (VIT_DetectionResults == VIT_WW_DETECTED) { PRINTF(" - WakeWord detected \r\n"); weather_data.ww_flag = 1; //kerry } else if (VIT_DetectionResults == VIT_VC_DETECTED) { // Retrieve id of the Voice Command detected // String of the Command can also be retrieved (when WW and CMDs strings are integrated in Model) VIT_Status = VIT_GetVoiceCommandFound(VITHandle, &VoiceCommand); if (VIT_Status != VIT_SUCCESS) { PRINTF("VIT_GetVoiceCommandFound error: %d\r\n", VIT_Status); return VIT_Status; // will stop processing VIT and go directly to MEM free } else { PRINTF(" - Voice Command detected %d", VoiceCommand.Cmd_Id); weather_data.vc_index = VoiceCommand.Cmd_Id;//kerry 1:ledon 2:ledoff 3:today weather 4:tomorrow weather 5:aftertomorrow weather if(weather_data.vc_index == 1)//1 { GPIO_PinWrite(GPIO1, 3, 1U); //pull high PRINTF(" led on!\r\n"); } else if(weather_data.vc_index == 2)//2 { GPIO_PinWrite(GPIO1, 3, 0U); //pull low PRINTF(" led off!\r\n"); } // Retrieve CMD Name: OPTIONAL // Check first if CMD string is present if (VoiceCommand.pCmd_Name != PL_NULL) { PRINTF(" %s\r\n", VoiceCommand.pCmd_Name); } else { PRINTF("\r\n"); } } }  3.3 Voice recognize weather information    In the weather_thread while, check the wakeup word and voice command, if meet the requirement, then create the socket connection, write the API and capture the weather data.   The related code is: while(1) { //add the command request, only cmd == weather flag, then call it. if((weather_data.ww_flag == 1)) { if(weather_data.vc_index >= 3) { // create connection //write API and read API Weather_process(); } memset(weather_data.weather_info, 0, sizeof(weather_data.weather_info)); weather_data.ww_flag = 0; weather_data.vc_index = 0; } vTaskDelay(10000); } void Weather_process(void) { char * datap, *datap1; datap = strstr((char*)weather_data.weather_info,"date"); if(datap != NULL) { memcpy(today_weather, datap,184);//max 1457 if(weather_data.vc_index == 3) { PRINTF("\r\n*******************today weather***********************************\n\r"); PRINTF("%s\r\n",today_weather); return; } } else return; datap1 = strstr(datap+4,"date"); if(datap1 != NULL) { memcpy(tomorr_weather, datap1,184);//max 1457 if(weather_data.vc_index == 4) { PRINTF("\r\n*******************tomorrow weather*******************************\n\r"); PRINTF("%s\r\n",tomorr_weather); return; } } else return; datap = strstr(datap1+4,"date"); if(datap != NULL) { memcpy(aftertom_weather, datap,184);//max 1457 if(weather_data.vc_index == 5) { PRINTF("\r\n*******************after tomorrow weather**************************\n\r"); PRINTF("%s\r\n",aftertom_weather); } } else return; }   Function Weather_process is used to refer to the voice recognized weather number to get the related date’s weather, and printf it. 4 Test result  the test result video: (view in My Videos) Print the log results as shown in Figure 11, after testing, you can see that the wakeup word and voice command can be successfully recognized, in the recognition of word sequence numbers 3, 4, 5 is the weather acquisition, you can successfully call the lwip socket client API, successfully obtain weather information and printf it.   Fig 11 system test print result  evkmimxrt1060_maestro_weather_backup.zip is the project without sound playback, weather information will print to the terminal! 5 Meet issues conclusion 5.1 LWIP failed to get weather    When creating the code, call the postman provided http code: GET /v3/weather/weatherInfo?key=8f777fc7d867908eebbad7f96a13af10& city=310000& extensions=all& output=JSON HTTP/1.1 Host: restapi.amap.com    Add it to the socket API function: uint8_t get_weather[]= "GET /v3/weather/weatherInfo?key=xxx&city=310000&extensions=all&output=JSON HTTP/1.1\r\nHost: restapi.amap.com\r\n\r\n\r\n\r\n";    The test result is:   Fig 12 socket weather API return issues     We can see, server connection is OK, http also return back the data, but it report the parameter issues, after checking, we use the postman C code, and put it to the get_weather: uint8_t get_weather[]= "GET /v3/weather/weatherInfo?key=xxx&city=310000&extensions=all&output=JSON HTTP/1.1\r\nHost: restapi.amap.com\r\n\r\n\r\n\r\n"; Then, it can capture the weather data, the same as postman test result. 5.2 VIT LWIP merger memory is not enough     After combining the maestro_record and lwip socket code together, compile it, it will meet the DTCM memory overflow issues. Fig 13 memory overflow After optimize, still meet the DTCM overflow issues, so, at last, choose to reconfigure the FlexRAM: OCRAM 192K, DTCM 256K, ITCM 64K Compile it, and the memory overflow issues disappear:   Fig 14 FlexRAM recofiguration 5.3 Print Chinese word in tera    Directly use teraterm, when the weather API returns the Chinese word, the print out information is the garbled code, and then after the following configuration, to achieve Chinese printing: Setup  ->  Terminal Locale    : american->chinese Codepage : 65001 ->936 Fig 15 Tera Term Chinese word print In summary, after various data collection and problem solving, in MIMXRT1060-EVK board  combined with the official SDK complete the function of customizing VIT voice commands to obtain real-time weather and local control.So, even if the ordinary RT series which is not S/L/A/F series, you also can use VIT to implement speech recognition functions. 6 Add the sound broadcast    This chapter mainly gives the method how to add the sound broadcast with the mp3 video data which is stored in the memory, but to the realtime weather data playback, it is not very freely, it needs to check the weather data, and use the video mp3 data lib get the correct mp3 data, as it is not the online TTS method.     So, here, just share one example add the sound broadcast, eg: WW : “小恩小恩”    ->   “小恩来了,请吩咐!” VC  :“今天天气”   ->   “温度32.1度” VC playback is fixed now, if need to play real data, it needs to generate the mp3 voice data lib, then according to the feedback weather information, to generate the correct weather mp3 data array, and play it, as this is a little complicated, but not difficult, so here, just use one fixed sound give an example of it. 6.1 MP3 playback audio data preparation     For audio broadcasting which need to convert the Chinese word into MP3 files, you can use some online speech synthesis software, here use Baidu online speech synthesis function, you can view the previous article, chapter 2.2.2 online speech synthesis: https://community.nxp.com/t5/i-MX-RT-Knowledge-Base/RT106L-S-voice-control-system-based-on-the-Baidu-cloud/ta-p/1363295     If use the Baidu online speech synthesis generated mp3 file to convert to the c array directly, it will meet the first audio play issues, so, here we use the Audacity to convert the mp3 file, the convert configuration is like this:  Fig 16 Audacity convert configuration     After the regeneration of mp3, you can use xxd .exe to convert the mp3 file to an array of C files, and then put it into RT-related memory or external flash , xxd .exe can be found at the following link: https://github.com/baldram/ESP_VS1053_Library/issues/18 The convert command like this: xxd -i your-sound.mp3 ready-to-use-header.c Convert the xiaoencoming.mp3 and temptest.mp3 file to the C array, then modify the data to the C file, save file as: xiaoencoming.h and temptest.h. Here, take xiaoencoming.c as an example: #define XIAOEN_MP3_SIZE  6847 unsigned char xiaoencoming_mp3[XIAOEN_MP3_SIZE] = {   0x49, 0x44, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x54, 0x58, …   0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 }; unsigned int xiaoencoming1_mp3_len = XIAOEN_MP3_SIZE;//6847; Until now, the playback audio data is finished.     Copy xiaoencoming.h and temptest.h to project path: evkmimxrt1060_maestro_weather_mp3\source 6.2 Play the MP3 data from memory    Here, share the related code. 6.2.1 app_streamer.c added code    #include "xiaoencoming.h" #include "temptest.h" void *voice_inBuf = NULL; void *voice_outBuf = NULL; status_t STREAMER_file_Create(streamer_handle_t *handle, char *filename, int eap_par) { STREAMER_CREATE_PARAM params; OsaThreadAttr thread_attr; int ret; ELEMENT_PROPERTY_T prop; MEMSRC_SET_BUFFER_T inBufInfo = {0}; SET_BUFFER_DESC_T outBufInfo = {0}; PRINTF("Kerry test begin!\r\n"); if(filename == "temptest.mp3") inBufInfo = (MEMSRC_SET_BUFFER_T){.location = (int8_t *)temptest_mp3, .size = TEMPtest_MP3_SIZE}; else if(filename == "xiaoencoming.mp3") inBufInfo = (MEMSRC_SET_BUFFER_T){.location = (int8_t *)xiaoencoming_mp3, .size = XIAOEN_MP3_SIZE}; /* Create message process thread */ osa_thread_attr_init(&thread_attr); osa_thread_attr_set_name(&thread_attr, STREAMER_MESSAGE_TASK_NAME); osa_thread_attr_set_stack_size(&thread_attr, STREAMER_MESSAGE_TASK_STACK_SIZE); ret = osa_thread_create(&msg_thread, &thread_attr, STREAMER_MessageTask, (void *)handle); osa_thread_attr_destroy(&thread_attr); if (ERRCODE_NO_ERROR != ret) { return kStatus_Fail; } /* Create streamer */ strcpy(params.out_mq_name, APP_STREAMER_MSG_QUEUE); params.stack_size = STREAMER_TASK_STACK_SIZE; params.pipeline_type = STREAM_PIPELINE_MEM; params.task_name = STREAMER_TASK_NAME; params.in_dev_name = "buffer"; params.out_dev_name = "speaker"; handle->streamer = streamer_create(&params); if (!handle->streamer) { return kStatus_Fail; } prop.prop = PROP_DECODER_DECODER_TYPE; prop.val = (uintptr_t)DECODER_TYPE_MP3; ret = streamer_set_property(handle->streamer, prop, true); if (ret != STREAM_OK) { streamer_destroy(handle->streamer); handle->streamer = NULL; return kStatus_Fail; } prop.prop = PROP_MEMSRC_SET_BUFF; prop.val = (uintptr_t)&inBufInfo; ret = streamer_set_property(handle->streamer, prop, true); if (ret != STREAM_OK) { streamer_destroy(handle->streamer); handle->streamer = NULL; return kStatus_Fail; } handle->audioPlaying = false; error: PRINTF("End STREAMER_file_Create\r\n"); PRINTF("Kerry test end!\r\n"); return kStatus_Success; } The code implements the thread build, creates a streamer, defines it as playing from memory, decodes the properties for MP3, and specifies an array of MP3 files in memory. Specify a different array of mp3 files in memory based on the calling file name. 6.2.2 cmd.c added code void play_file(char *filename, int eap_par) { STREAMER_Init(); int ret = STREAMER_file_Create(&streamerHandle, filename, eap_par); if (ret != kStatus_Success) { PRINTF("STREAMER_file_Create failed\r\n"); goto file_error; } STREAMER_Start(&streamerHandle); PRINTF("Starting playback\r\n"); file_playing = true; while (streamerHandle.audioPlaying) { osa_time_delay(100); } file_playing = false; file_error: PRINTF("[play_file] Cleanup\r\n"); STREAMER_Destroy(&streamerHandle); osa_time_delay(100); } Play file, it calls the STREAMER_file_Create API function, start play, and wait the play finished, then release the STREAMER. shellRecMIC API function add the VIT recorded flag, which is used to play feedback audio file. static shell_status_t shellRecMIC(shell_handle_t shellHandle, int32_t argc, char **argv) { … //kerry PRINTF("Kerry MP3 stream data test!\r\n"); PRINTF("---weather_data.ww_flag =%d--\r\n ", weather_data.ww_flag); PRINTF("---weather_data.vc_inde =%d--\r\n ", weather_data.vc_index); PRINTF("---weather_data.mp3_flag =%d--\r\n ", weather_data.mp3_flag); if(weather_data.ww_flag == 1) { play_file("xiaoencoming.mp3", 0); } if(weather_data.vc_index == 3) { play_file("temptest.mp3", 0); } if(weather_data.mp3_flag != 0) { weather_data.ww_flag = 0; weather_data.vc_index = 0; } weather_data.mp3_flag = 0; /* Delay for cleanup */ osa_time_delay(100); return kStatus_SHELL_Success; } If detect the Wakeup Word: “小恩小恩”, play feedback audio: “小恩来了请吩咐”. If detect the voice command: “今天天气”, play feedback audio: “温度32.1度”, please note, this playback just an example, it is the fixed audio, you also can create audio word lib, then according to the received weather information, combine the related word audio together, then playback it. This is a little complicated, but not difficult. So, if need to play the free audio, also can consider the online TTS method in real time. 6.2.3 VIT WW and VC flag VIT_Execute function int VIT_Execute(void *arg, void *inputBuffer, int size) { … if (VIT_DetectionResults == VIT_WW_DETECTED) { PRINTF(" - WakeWord detected \r\n"); weather_data.ww_flag = 1; //kerry weather_data.mp3_flag = 1; } else if (VIT_DetectionResults == VIT_VC_DETECTED) { // Retrieve id of the Voice Command detected // String of the Command can also be retrieved (when WW and CMDs strings are integrated in Model) VIT_Status = VIT_GetVoiceCommandFound(VITHandle, &VoiceCommand); if (VIT_Status != VIT_SUCCESS) { PRINTF("VIT_GetVoiceCommandFound error: %d\r\n", VIT_Status); return VIT_Status; // will stop processing VIT and go directly to MEM free } else { PRINTF(" - Voice Command detected %d", VoiceCommand.Cmd_Id); weather_data.vc_index = VoiceCommand.Cmd_Id;//kerry 1:ledon 2:ledoff 3:today weather 4:tomorrow weather 5:aftertomorrow weather weather_data.mp3_flag = 2; if(weather_data.vc_index == 1)//1 { GPIO_PinWrite(GPIO1, 3, 1U); //pull high PRINTF(" led on!\r\n"); } else if(weather_data.vc_index == 2)//2 { GPIO_PinWrite(GPIO1, 3, 0U); //pull low PRINTF(" led off!\r\n"); } // Retrieve CMD Name: OPTIONAL // Check first if CMD string is present if (VoiceCommand.pCmd_Name != PL_NULL) { PRINTF(" %s\r\n", VoiceCommand.pCmd_Name); } else { PRINTF("\r\n"); } } } return VIT_Status; } Until now, all the code is added. 6.2.4  playback audio test result     This is the audio playback test result: (view in My Videos)   Fig 17 playback audio log   From the test result, we can see, we also can use the mp3 data which is stored in the memory and play it as audio playback.   The code project is: evkmimxrt1060_maestro_weather_mp3.zip. i.MXRT 106x
查看全文
PHY3250ブートローダーの復元 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Phytec LPC3250ボード上の キックスタート または S1L ブートローダーを誤って消去し てしまった場合は、この手順を使用してそれらを復元できます。 この復元方法で提供されるブートローダーは、Phytecボードに付属するバージョンよりも新しい可能性があることに注意してください。ブートローダーのオリジナルバージョンは、PhytecのWebサイトからもダウンロードできます。 ボード上のブートローダの復元には特別なハードウェア(JTAGなど)は必要なく、LPC32x0共通ドライバライブラリにビルドまたは含まれているブートローダとツールを使用して実行されます。ただし、アップデート手続きを行うには、シリアルポート付きのPCが必要です。 キックスタート ローダーと S1L の復元 は、2段階のプロセスです。 キックスタート ローダーが最初に復元され、次に S1L が復元されます。シリアルローダーは、アプリケーションとバーナーイメージ(アプリケーションをNANDFLASHにプログラムするために使用されます)を転送するために使用されます。LPC32x0は、ダウンロード後に画像を自動的にNANDフラッシュに書き込み、ステータスを提供します。 ステップ1:リソースページのビルド済みブートソフトウェアと復元イメージをダウンロードします。 ステップ2:WindowsベースのPCでファイルを抽出します ステップ3:Phytecボードの下部シリアルコネクタとPCの間にシリアルケーブルを接続します ステップ4:シリアルローダーソフトウェアを起動します(LPC3250_Loader.exe)ビルド済みのブートソフトウェアパッケージに含まれています。 ステップ5:シリアルローダーの「プライマリブート(IRAM)」ファイルをburner_kickstart_nand_small_block_rvw.binファイルに設定します。シリアルローダーの「Secondary Executable (SDRAM)」ファイルをkickstart_nand_small_block_rvw.binファイルに設定します。Comport コントロールの選択が、Phytec ボードに接続されている PC の COM パーツと一致していることを確認します。 注: ビルド済みのバイナリの名前は、バイナリのビルドに使用したツールによっては、手順 5 と 7 に記載されている名前と若干異なる場合があります。バイナリが Realview ではなく GNU でビルドされた場合、各名前の 'rvw' フィールドには、代わりに識別された 'gnu' が含まれます。必要に応じて、お持ちのバイナリのファイル名を変更してください。   ステップ6:シリアルローダーの「Load bin's / Start primary」ボタンを押して、ボードの電源を入れます。バーナー イメージとキックスタート ローダー イメージがボードに転送され、キックスタート ローダーはバーナー アプリケーションによってブート ROM からブートするために NAND FLASH ブロック 0 にプログラムされます。ファイルが転送されたら、「ターミナルモードを有効にする」ボタンを押してプログラムのステータスを確認します。シリアルローダーツールの[ステータス/ターミナル出力]ウィンドウに、次の出力が表示されます。   BootIDを待っていますか?..þ5 ..設立する!「A」を送信しています。完成です!2番目のBootIdを期待しますか?..5 ..設立する!'U','3'..完成です!「R」を期待してください.。R ..設立する!startaddress .. を送信しています。完成です!送信サイズ ..完成です!コードを送信しています..完成です!--- セカンダリ実行可能ファイルのロード--- 「X」を待ちます。X ..設立する!-- コマンドを送信しています ..p ..完成です! startaddress .. を送信しています。完成です!送信サイズ ..完成です!プライマリブートからの受け入れを待ちます..o ..わかりました! コードを送信しています..完成です!最終的な 't' を期待してください ..t ..設立する ---- セカンダリ実行可能ファイルがロードされました。--- --- ターミナルモードの有効化 --- ブロックをフォーマットしています... フォーマットが完了 キックスタートをフラッシュに書き込んでいます... データの検証......首尾良く NANDフラッシュが正常にプログラムされています ステップ7:シリアルローダーの「プライマリブート(IRAM)」ファイルをburner_s1app_nand_small_block_rvw.binファイルに設定します。シリアルローダーの「Secondary Executable (SDRAM)」ファイルをs1l_from_kick_full_rvw.binファイルに設定します。Comport コントロールの選択が、Phytec ボードに接続されている PC の COM パーツと一致していることを確認します。   ステップ8:シリアルローダーの「Load bin's / Start primary」ボタンを押して、ボードをリセットします。バーナーイメージと S1L イメージがボードに転送され、 S1L はキックスタートローダーからブートするためにNANDFLASHブロック1(およびそれ以降)にプログラムされます。ファイルが転送されたら、「ターミナルモードを有効にする」ボタンを押してプログラムのステータスを確認します。シリアルローダーツールの[ステータス/ターミナル出力]ウィンドウに、次の出力が表示されます。   BootIDを待っていますか?..5 ..設立する!「A」を送信しています。完成です!2番目のBootIdを期待しますか?..5 ..設立する!'U','3'..完成です!「R」を期待してください.。R ..設立する!startaddress .. を送信しています。完成です!送信サイズ ..完成です!コードを送信しています..完成です!--- セカンダリ実行可能ファイルのロード--- 「X」を待ちます。X ..設立する!-- コマンドを送信しています ..p ..完成です! startaddress .. を送信しています。完成です!送信サイズ ..完成です!プライマリブートからの受け入れを待ちます..o ..わかりました! コードを送信しています..完成です!最終的な 't' を期待してください ..t ..設立する ---- セカンダリ実行可能ファイルがロードされました。--- --- ターミナルモードの有効化 --- ブロックをフォーマットしています... フォーマットが完了 S1 画像をフラッシュに書き込みています... NANDフラッシュが正常にプログラムされています ステップ8:シリアルローダーを閉じてターミナルプログラムを開き、ボードをリセットします シリアルローダツールを閉じて、Teratermなどのターミナルプログラムを開きます。ボードをリセットすると、 S1L が起動するはずです。   5 Phytec 3250ボード ビルド日: May 21 2010 12:43:21 PHY3250>
查看全文
[过滤器:垃圾邮件] evelynteddy 的帖子正文与 " *telegram* " 相符,板 " imx-processors "。 [过滤器:垃圾邮件] evelynteddy 的帖子正文与 " *telegram* " 相符,板 " imx-processors "。 帖子主题:回复:IMX7ULPEVK-等待根设备 /dev/mmcblk0p2... 职位机构: 如何从骗子手中找回丢失或被骗的加密货币,请访问 OPTIMISTIC HACKER GAIUS。 上周我的加密货币被骗后,我感到很无助,不知道该怎么办。我与乐观黑客盖乌斯取得了联系,他一直都很专业,有良好的沟通,并设定了合理的期望值。他细心地处理问题,经常提供最新信息,并描述了每一个步骤。通过坚持不懈的努力和专业技术,我被盗的加密货币被找到并追回。我吸取了重要的网络安全教训,并通过这次遭遇恢复了信心。我感谢你们在这段艰难时期给予我的帮助和指导。强烈建议 网站:optimistichackargaius.co m 电子邮件:support @ optimistichackargaius.com。 WhatsApp number:+44 737 674 0569 电报:t.me /OPTIMISTICHACKERGAIUSS 正文"电报" 匹配的过滤模式"*telegram*" 。 用户[id=259418,login=evelynteddy]的发帖因以下最终用户面临的错误而被拒绝: 信息正文中包含 Telegram,这在本社区是不允许的。请在发送您的帖子前删除这些内容。
查看全文
S32R45 SptEcsIsrCb エラー! アラームの原因を検索すると、「PDMA での AXI 読み取りエラー」が表示されます。このアラームが発生する原因は何でしょうか? SPT エラー キューがオーバーフローしました。最初の 10 件のエラーのみが報告されます。最後に実行されたカーネルを確認してください! SPT完了 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 SptEcsIsrCb エラー!、ステータス: 0x11005、エラー情報: 0x10000 RsdkSptRun が完了しました。SPT プロセッシングが完了しました。次のカーネルの準備ができました。 Re: S32R45 SptEcsIsrCb error! こんにちはピーター、 ご返信ありがとうございます。   あなたが挙げた理由に従い、私は特に以下の点に重点を置いてコードを注意深くチェックしました。   WR_5、問題は見つかりませんでした。さらに、SPT カーネル コードは変更していません。   コード初期リスト:   AppMemAllocBuffer ( pHeapMem 、 & gSdadcSampleBufferBufH [インデックス]、 sizeof ( uint16_t ) * RSDK_SPT_RANGE512_4CH_IN_BUF_SIZE 、                           RSDK_SPT_DATA_ADDR_ALIGN_BYTES 、 RSDK_OALMEM_CHUNK_ID_CBRAM );   RelocSptCode ( gSptModuleCodeRelocBufH . virtAddr 、 RsdkSptRange512smp128crp4ch 、 RSDK_SPT_GET_KERNEL_SIZE ( RsdkSptRange512smp128crp4ch ));   np = 0 ; sptContext . kernelParList [ np ]. paramType= RSDK_SPT_PARAM_TYPE_ADDR ; sptContext 。 kernelParList [ np ++ ]。 paramValue = ( uintptr_t ) gSdadcSampleBufferBufH [ 0 ]。 phyAddr ;   sptContext . kernelParList [ np ]. paramType= RSDK_SPT_PARAM_TYPE_ADDR ; sptContext 。 kernelParList [ np ++ ]。 paramValue = ( uintptr_t ) gRadarCubeResultsBufH 。 phyAddr ;   sptContext . kernelParList [ np ]. paramType= RSDK_SPT_PARAM_TYPE_ADDR ; sptContext 。 kernelParList [ np ++ ]。 paramValue = ( uintptr_t ( gFft512TwiddleFactorsBufH . phyAddr );    sprintf (ファイル名、 " %s% s " 、 FILE_IN_PATH 、 "fft512_twiddle_factors.dat" ); /* RSDKデータは、PPCアーキテクチャとの互換性のため、ビッグエンディアン形式でファイルに保存されます。エンディアンの変換は、ファイルへのデータの読み書き時にのみ行われます。プロセッシングフロー内での変換は必要ありません。*/   DbgReadFileConvert ( fileName 、 0 、 ( char * ) gFft512TwiddleFactorsBufH . virtAddr 、 gFft512TwiddleFactorsBufH . numBytes 、 ENDIAN_CHANGE 、 DATA_BUFF_IS_CACHED );           sptContext . kernelParList [ np ]. paramType= RSDK_SPT_PARAM_TYPE_ADDR ; sptContext 。 kernelParList [ np ++ ]。 paramValue = ( uintptr_t ) gFft512BlackmanWindowBufH 。 phyAddr ;   sprintf (ファイル名、 " %s% s " 、 FILE_IN_PATH 、 "fft512_win_blackman.dat" ); DbgReadFileConvert ( fileName 、 0 、 ( char * ) gFft512BlackmanWindowBufH . virtAddr 、 gFft512BlackmanWindowBufH . numBytes 、 ENDIAN_CHANGE 、 DATA_BUFF_IS_CACHED );   sptContext . kernelParList [ np ]. paramType= RSDK_SPT_PARAM_TYPE_VALUE ; sptContext . kernelParList [ np ++ ]. paramValue = 3 ; /* 出力シフトなし */ sptContext . kernelParList [ np ]. paramType= RSDK_SPT_PARAM_TYPE_LAST ;   印刷リスト: gSptModuleCodeRelocBufH.phyAddr: 0x34000000 gSdadcSampleBufferBufH[0].phyAddr: 0x28000000 gSdadcSampleBufferBufH[1].phyAddr: 0x28003000 gSdadcSampleBufferBufH[2].phyAddr: 0x28006000 gSdadcSampleBufferBufH[3].phyAddr: 0x28009000 gRadarCubeResultsBufH.phyAddr: 0x34002000 gFft512TwiddleFactorsBufH.phyAddr: 0x340bd000 gFft512BlackmanWindowBufH.phyAddr: 0x340bf000 Re: S32R45 SptEcsIsrCb error! こんにちは、 考えられる原因は次のとおりです: 1. SPT入力とS32DS入力の不一致 SPT カーネル入力が予期された S32DS 構成と一致しませんでした。 PDMA は、SPT カーネルの構成によって決定されたアドレスでメモリを読み取ります。バッファ サイズ、キューブ ベース アドレス、またはチャネル カウントが揃っていない場合、PDMA は無効または予期しないメモリ位置を読み取ろうとする可能性があります → AXI 読み取りエラー。   2. 作業レジスタ(WR_x)の設定が正しくないか破損している PDMA が無効または誤って構成されたバッファを指す作業レジスタを使用する場合、AXI ファブリックは不正な読み取り要求を受信し、バス エラーをトリガーします。 https://community.nxp.com/t5/Other-NXP-Products/SPT3-1-1024-128-16range-don-t-work/mp/1621567   3. 同期PDMA実行モードと非同期PDMA実行モード .sync → .async .syncでモードでは、PDMA は誤った構成 (バッファ ポインタ、依存関係など) により満たされない可能性のある条件を待機します。 これにより、エラー フラグが蓄積され、PDMA エンジンが無効な読み取りを繰り返し試行すると AXI エラーが発生する可能性があります。   4. データ幅またはフォーマットが間違っている(例:WR_16とWR_11) PDMA が 16 ビットの複合データを期待しているが、ターゲット レジスタ/バッファが異なる幅/レイアウトに設定されている場合、AXI 読み取りバーストが不整合になる可能性があり、プロトコル エラー → AXI 読み取りエラーが発生します。   5. AXIプロトコルレベルのエラー(一般的な原因) S32R45 に固有のものではありませんが、AXI 読み取りエラー メカニズムは普遍的に適用されます。 バースト長またはサイズが無効です マップされていないアドレスまたは保護されたアドレスからの読み取りの試み スレーブタイムアウトまたは応答しないターゲット アップストリームの問題による読み取り応答エラー(SLVERR または DECERR) PDMA が不正な AXI トランザクションを生成すると、AXI インターコネクトは SLVERR を返します。これは PDMA 読み取りエラーとして表示されます。 あなたのケースで最も可能性の高い原因 両方のログに基づくと、主な容疑者は次のとおりです。 間違ったWR_xレジスタ(特にWR_5 / WR_16の選択) 非常に一般的には誤って構成され、無効な AXI 読み取りにつながります。 SPTカーネル入力とS32DS入力の不一致 以前のケースでは、見落とされ、根本原因として検証されることがよくあります。 PDMA同期モードが依存関係のデッドロックを引き起こす .syncを切り替えてみる→ .asyncデバッグ用。 よろしくお願いいたします。 ピーター     Re: S32R45 SptEcsIsrCb error! こんにちはピーター、 レーダー フロントエンドの波形サンプリング ポイントの数を 2 倍にすると、エラーは発生しなくなりましたが、チャープ バッファのサイズは変更されていません。問題をさらに分析するのにご協力ください。どうもありがとうございます。 Re: S32R45 SptEcsIsrCb error! こんにちは、 シナリオにおける最も可能性の高い根本原因: カーネルの予想されるチャープピッチと実際のバッファレイアウト間のストライド/アライメントの不一致 - サンプルを 2 倍にするとバーストサイズが揃い、バグがマスクされます。 WR_x 選択 / データ幅の不一致 (実数 vs 複素数、16 ビット vs その他)。サンプル数が変化すると偶然に修正されます。 kernelParList 内のパラメータ順序/タイプの混同 (ADDR と VALUE) が、特定のサイズの場合にのみ発生します。ミラー スレッドには同様のパラメータ シーケンスが示されており、インデックスをスリップするのは簡単です。 WR 24ビットオフセットエッジは、2倍にすると異なるパッキング/レイアウトで消えます。 よろしくお願いいたします。 ピーター
查看全文
CSEC GenerateMACAddrMode アドレス範囲 メリークリスマス こんにちは CSECのGenerateMACAddrMode関数を使用していたところ、アドレス値が0x7DFFFを超えるとエラーが発生します。これは普通ですか? Re: CSEC GenerateMACAddrMode address range 私のせい つまり512KBからCANができない CSEC_DRV_GenerateMACAddrMode(CSEC_RAM_KEY、(uint8_t *)0x0007FFFC、0x00000080、(uint8_t *)cmacout); ただし、addr = 0x0007FFFC、len = 0x00000080 を使用します エラーもありませんが、範囲外です Re: CSEC GenerateMACAddrMode address range こんにちは@SaLan これは、Addr モード(ポインター方法とも呼ばれます)の CMD_GENERATE_MAC コマンドの制限です。 パーティション(つまりブロックサイズは派生に応じて128KB、256KB、または512KBになります。 よろしくお願いいたします。 ルーカス
查看全文
FS26 の起動後に「WUEVENT = BATTERY FAIL」というエラー メッセージが表示されるのはなぜですか? 開発にはS32K3X4EVB-T172を使用しています。 起動後、WUEVENT を読み取ろうとすると、BATTERY FAIL エラー メッセージが表示されることに気付きました。 これは VSUPOV_I、VSUPUV6_I、および VSUPUVH_I に関連しているようですが、これらのエラー フラグではエラーは発生しませんでした。 次に、ADC を使用して VSUP 電圧を読み取りました。入力電圧は 12V でしたが、約 11.925V でした。 WUEVENT からの「BATTERY FAIL」メッセージを防ぐにはどうすればよいですか? Re: Why does the FS26 display the error message "WUEVENT = BATTERY FAIL" after booting? 私のコードでは、IF WUEVENT == 15 / BATTERY FAIL と記述し、これを WU_CLR に書き込んでエラーをクリアしています。これは、起動するたびに WU_CLR を実行すると、GPIO1_I、GPIO2_I などの他のウェイクアップ通知が表示されなくなるためです。 しかし、これが正しい使い方であるかどうかはわかりません。 Re: Why does the FS26 display the error message "WUEVENT = BATTERY FAIL" after booting? こんにちは、アレン。 POR または VSUP が失われるたびに、BATTERY FAIL が報告されます。デバイスの電源投入後にウェイクアップ ソースをクリアするには、WU_CLR ビットを書き込んでください。これらのビットは、デバイスのウェイクアップ後にクリアされない限り、常に存在します。 BRs、トーマス
查看全文
S32 Design Studio 3.6.5 Release Announcement Product Release Announcement Analog & Automotive Embedded Systems S32 Design Studio 3.6.5 The Analog & Automotive Embedded Systems (AAES) - Software Development Tools Engineering Team at NXP Semiconductors is pleased to announce the release of the S32 Design Studio 3.6.5 with support for: AMCU AP RAS APN S32K3 Family S32G Family S32R41 Family S32J Family S32K1 Family S32ZE Family S32R45 Family   S32M2 Family S32N Family S32R47 Family       SAF8xxx Family   Major Features for S32 Design Studio 3.6.5 Installer S32 Design Studio 3.6.5 is delivered with all public NPI's in a single 2.63GB installer to improve first time user experience. Additional packages for alpha customers are available based on Flexera entitlement and can be installed on top of S32 Design Studio 3.6.5 using Extension and Updates.   Installer will require admin rights only when the user chooses to install components which need elevation (Visual Studio Redistributable or debugger drivers). If a user chooses a custom installation only with S32DS IDE and its components (no drivers) the installation will finish without admin rights. Platform IDE and UI Integrated Cody, the open-source Eclipse plugin from Sourcegraph, into S32 Design Studio. This plugin is installed by default, allowing users with a valid Cody license to log in directly within S32DS and access Generative AI features. Note: Users must agree to the Sourcegraph Terms of Service before using Cody. Enabled integration with the NXP Application Code Hub, allowing users to browse available examples and import them directly from the hub page into S32 Design Studio. Note: the application examples will be published soon on the Application Code Hub URL. Note: This image is taken from internal sources. The illustrated examples are currently under development and will be available soon. Extended the Quick Fix mechanism for the missing NPI and Real Time Drivers packages. Basically, an error message displays in the Problems view whenever the IDE identifies a missing package (build tool, NPI, RTD) associated with the current project. The Quick Fix automatically installs the missing package if it is available in the configured Update Sites. Note: not all scenarios are covered, there may be cases where the tool cannot determine if a package is missing. A new Recent tab has been added in S32DS Extensions and Updates to display the latest installed packages, providing a clear history of user actions related to package installations. In addition, the default sorting was changed in All tab to bring greater visibility to NXP packages. Added support for drag-and-drop of S32 Design Studio p2 update sites / installable packages into the S32DS Extensions & Updates window. Users can now simply drag the ZIP file into the window, and the package will be automatically inserted and selected, requiring only a click on Next to complete the installation. Significant improvements to Secure Debugging:  Added a dedicated Debug Card view that allows users to generate debug card binaries based on custom input. Implemented Challenge & Response functionality for Linux environment.  Enabled Secure Registry Key view for managing secure registry keys on Linux.  UI is aligned to the secure debugging functionality latest changes introduced by HSE2. Extended the S32 Debugger OS awareness support with FreeRTOS. OS threads are now visible in S32 Design Studio and user will be able to individually debug them. Extended the command line support to display OS threads and objects. Enable debug in low power mode with S32 Debugger for S32K3xx devices:  The debug session will recover after core exits low power or standby mode, allowing the user to continue application debugging. Debugging from the first instruction after low power exit is now possible by using this configuration command when starting the debug session: monitor template config :ccs:S32K3XX:SoC#0 6 1 Expanded the S32Trace debug-info parser to fully support DWARF-5, adding compatibility with projects using GCC 11.4 and newer. Major Features for NPIs S32N Family S32Flash Programmer improvements for erase and verify write operations on S32N5. S32G2/G3, S32J100, and SAF8xxx Families S32J100 development package is now public and delivered inside S32DS installer. Enabled debugging support for S32G2 devices on VDK R10. S32Flash Programmer enhancements for erase and verify write operations. Various bug fixes and improvements for arm cores and accelerators. This release is available for download on: S32 Design Studio 3.6.5 can be found on  nxp.com  Flexera catalogue S32 Design Studio for S32 Platform v.3.6 Target Audience: S32 Design Studio 3.6.5 and bundled NPIs releases are targeted for public audience. The Installation Procedure for Packages: Download S32 Design Studio v3.6.5, available on nxp.com and in Flexera catalogue S32 Design Studio for S32 Platform v.3.6. If you have any local admin restrictions(ex. Admin by Request) the installer will request elevation, alternatively you can use “Run as Administrator” to run the installer. Download any additional packages if it’s required. Start S32 Design Studio v3.6.5 and install the desired package. Go to  Help > S32DS Extensions and Updates. For additional packages, in the S32DS Extensions and Updates dialog box, drag the ZIP file into the window, and the package will be automatically inserted and selected, requiring only a click on Next to complete the installation, or click Add Update Sites. Navigate to the directory with the downloaded ZIP file. Choose it and click Open, then click OK. You will get back to S32DS Extensions and Updates and can use this dialog to select desired packages.​​ Technical Support: Please use the public community for general questions: https://community.nxp.com/community/s32/s32ds For internal packages please use INTERNAL S32DS NXP Community space:https://community.nxp.com/groups/internals32ds
查看全文
需要帮助:在 RT1189 上从 FlexSPI2 QSPI 闪存启动 我们正在尝试在自定义硬件上启动用户应用程序。这种定制硬件仅有 FlexSPI2 QSPI 闪存,使用端口 A 上的主引脚组进行连接。闪存设备是美光 MT25QU256ABA。RT1189 (RT1189CVM8C) 上的启动 ROM 无法正确配置内存,启动失败。但是,恩智浦安全配置工具可以成功读取和写入数据。 闪存配置块 (FCB) 是使用安全配置工具创建的: XIP 启动标头在映像编译本身中被禁用。取而代之的是,安全配置工具被配置为使用从简化用户界面生成的 FCB,使用上面屏幕截图中显示的确切设置。虽然上述截图中没有显示,但"测试连接" 已通过。 此外,当安全配置工具(此后称为 " SPT ")提示配置外部存储器时,处理器和该工具可以成功读取 FlexSPI2 内存。如下图所示。 当用户打开闪存编程器工具时,在弹出窗口中单击 " 是 " 和/或单击 " 配置外部存储器 " 按钮将导致 SPT 使用上面显示的闪存配置模块设置来初始化 FlexSPI2 闪存以进行编程。 以下屏幕截图是在刷新完整应用程序映像(偏移量 0x400 处的 FCB,偏移量 0x1000 处的用户应用程序)后捕获的: 这让我相信闪存配置块是正确的。 RT1180 上的以下熔丝位被烧毁。所有其他熔丝位均为默认值: BOOT_CFG0 [6] (BT_FUSE_SEL)-> 1b,用于启用从熔丝启动 BOOT_CFG2[7] (FLEXSPI_INSTANCE) -> 1b,用于选择 FlexSPI2(默认为 FlexSPI1)。 将 BOOT_MODE 引脚设置为 000b(用于 " 从内部熔丝启动)会导致 RT1189 没有任何活动。它需要启动到"无限循环" 模式,然后再返回到串行下载器模式,才能再次与它通信。 将 BOOT_MODE 引脚设置为 100b(用于从 FlexSPI " 启动 ")会导致 RT1189 保持 " 卡住 ",但可以被 jLink 调试探测器停止。 尝试使用 BOOT_MODE 100b 从 FlexSPI 启动后暂停时,检查 FlexSPI2 内存区域显示全部为零: 值得注意的是,"all zeroes" 与 RT1189 的 FlexSPI2 存储器区域的默认状态不一致。以下屏幕截图是在未配置外部存储器的情况下启动到串行下载器模式后捕获的: 最后一件事:用户应用程序中 MCUXpresso 示例的链接器脚本已更改为从 FlexSPI2 启动: 注意:截图中的标题显示"0x14000000" ,但"0x04000000" 才是代码中使用的真实值。这是一个错字 这一点在 SPT 中有所体现: 综上所述,我目前的理解是这样的: FCB 必须正确,否则 SPT 将无法与连接到 FlexSPI2 Bank A 的外部闪存交互。 ROM 本身在启动时必须尝试以某种不同于 SPT 的方式初始化该外部存储器。如果没有 RT1189 启动 ROM 的源代码,如果不对其进行逆向工程,我就无法进一步调试,而作为恩智浦的客户,我们无意这样做。 我的问题 是我们的配置出了什么问题导致了这种行为? 有没有办法调试启动 ROM 以了解为什么它无法初始化闪存? 谢谢 Re: Help Needed: Booting from FlexSPI2 QSPI Flash on RT1189 @Sam_Gao、 感谢您的回复。 正如原帖所述: 启动实例的选择正是你在评论和 AN14589 中指定的内容:BOOT_CFG2 [7] 是为了选择 FlexSPI2 而烧掉的。 应用程序代码被链接到指定的 FlexSPI2 内存映射区 (0x04000000)(m_start_flash 更改为 0x04000000)。在你的回复中,你以 " 0x40000000 " 的形式给出,这不正确,如上面提到的应用笔记和 RT1189 参考手册中所述: FCB 出现在预期偏移位置。我们甚至把闪存芯片换成了可以正常工作的 MIMXRT1180EVK,但仍然无法正常工作。 使用逻辑分析器,我们得以确定闪存配置模块很可能由启动 ROM 读取——不久之后,时钟速度从 30 MHz 变为 125 MHz,读取数据通过 SPI 数据线传输。 有没有什么机制可以进一步调试启动ROM或启动顺序? Re: Help Needed: Booting from FlexSPI2 QSPI Flash on RT1189 经过数周的努力,我能够通过链接到 ITCM (0xFFE00000) 而不是 XIP 来启动处理器。但这个主题仍然相关 -- 为什么 FlexSPI2 上的 XIP 无法正常工作? Re: Help Needed: Booting from FlexSPI2 QSPI Flash on RT1189 您好, 在像 RT1189 这样的设备上,它似乎无法从 FlexSPI2 QSPI 闪存启动,这通常源于一些常见的配置区域。以下是潜在问题的详细介绍,以及如何调试启动 ROM 过程以确定根本原因。 参考 AN14589:https://www.nxp.com/docs/en/application-note/AN14589.pdf 1。检查启动实例选择: 需要明确告知启动 ROM 使用 FlexSPI2 而不是默认的 FlexSPI1。 这由 BOOT_CFG2[7] 熔丝或引脚控制。 你需要确保 BOOT_CFG2[7] 设置为 1 才能选择 FlexSPI2 作为启动实例。 仍需要正确设置主启动模式引脚 ( BOOT_MODE[2:0]) 才能从串行 或非 (例如,'100')启动 2.应用程序链接器地址:为 FlexSPI2 制作可启动映像时,必须链接应用程序代码,以便从 FlexSPI2 内存映像运行。FlexSPI2 的起始地址为 0x40000000 。你需要修改项目的链接器文件,将闪存起始地址( m_flash_start )设置为 0x40000000 。参考:AN14589 第7页。 3.FCB:启动 ROM 需要在闪存的开头(通常在偏移量 0x400 处)有一个有效的 512 字节配置块,才能正确初始化外部 QSPI 设备。如果此模块缺失、损坏或与您使用的特定闪存芯片不匹配,则启动 ROM 将无法与闪存通信。更多详情,请参阅https://docs.mcuxpresso.nxp.com/secure/latest/06_processor_specific_workflow.html#preparing-source-image-for-rt118x-devices Re: Help Needed: Booting from FlexSPI2 QSPI Flash on RT1189 看来没有问题。 有关启动 ROM 和启动顺序的信息,请参阅 https://www.nxp.com/docs/en/application-note/AN14589.pdf 了解更多详情。 当设备"卡住时",不要将其RESET。例如,使用 JLink/debugger 直接连接到运行中的内核,检查以下寄存器状态: 程序计数器 (PC): 如果 PC 处于 0x2xxxxxxx(ROM 区域),则表示 ROM 仍在运行或陷入无限循环(如等待外设响应)。 如果 PC 指向 0x002xxxxx(OCRAM)或其他 RAM 区域,则 ROM 可能尝试了跳转,但应用程序崩溃了。 如果 PC 指向 0x4000xxx(FlexSPI2 AMBA 区域)并被读取为全零或出现总线错误,则会发生跳转,但是 XIP 访问失败。
查看全文
i.MX6ULLのセカンダリブートがリセット後にハングする 私はeMMCを搭載したi.MX6ULLを持っており、AN13872ガイドのセクション13.2.2に従ってセカンダリブートをテストしようとしています。「セカンダリ ブートを使用したブート イメージの作成」 。 次のコマンドを使用してヘッダーを作成しました。 dd if=/dev/zero of=./header.bin bs=1K count=1 次に、 hexeditツールを使用して、オフセット0x208を0x00112233に変更し、 0x20Cを0に設定して、元の U-Boot がテスト目的でセカンダリ ブート イメージとして起動するSOにしました。 これは 16 進ダンプです: $ hexdump -C header.bin 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000200 00 00 00 00 00 00 00 00 33 22 11 00 00 00 00 00 |........3"......| 00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000400 次に、ヘッダーをシステムの U-Boot と連結しました。 cat header.bin u-boot-tagged.imx > u-boot-primary-secondary.imx 結果のファイルを SCP 経由でボードにコピーしました。 最後に、i.MX6 内部から、次のコマンドを使用してイメージを eMMC にフラッシュしました。 root@imx6ull:~# dd if=./u-boot-primary-secondary.imx of=/dev/mmcblk1 bs=512 skip=1 seek=1 結果の 16 進ダンプは次のとおりです。 root@imx6ull:~# hexdump -C /dev/mmcblk1 -n 1088 00000000 fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |................| 00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..| 00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u| 00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..| 00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........| 00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000001b0 00 00 00 00 00 00 00 00 2a 4a 6c 07 00 00 80 00 |........*Jl.....| 000001c0 01 40 0c 03 42 9f 00 20 00 00 e2 af 00 00 00 00 |[email protected].. ........| 000001d0 41 c0 83 03 e0 ff 00 e0 00 00 3e 70 1a 00 00 00 |A.........>p....| 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| 00000200 00 00 00 00 00 00 00 00 33 22 11 00 00 00 00 00 |........3"......| 00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000400 d1 00 20 40 00 00 80 87 00 00 00 00 2c f4 7f 87 |.. @........,...| 00000410 20 f4 7f 87 00 f4 7f 87 00 00 00 00 00 00 00 00 | ...............| 00000420 00 f0 7f 87 00 f0 09 00 00 00 00 00 d2 01 f0 40 |...............@| 00000430 cc 01 ec 04 02 0c 40 04 00 00 00 00 02 0c 40 68 |......@.......@h| 00000440 13.2.3節で説明したように、U-Bootからのセカンダリブートをテストするコマンドを実行すると、次のような結果が出ます: Hit any key to stop autoboot: 0 => mw.l 20D8044 40000000 => md.l 20D8044 1 020d8044: 40000000 ...@ => reset resetting ... しかし、この時点でシステムはハングします。 同じ U-Boot を 2 回連結し、それに応じてオフセット0x20Cの値を調整してみましたが、結果は変わりませんでした。これはこのテストの結果の 16 進ダンプです。 user@machine:~/linux-maker$ hexdump -C swu_singlecopy_rescue_imx6ull_emmc_20251128.sdcard -n 1072 00000000 fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |................| 00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..| 00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u| 00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..| 00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........| 00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000001b0 00 00 00 00 00 00 00 00 4e 58 99 cc 00 00 00 03 |........NX......| 000001c0 e0 ff 0c 03 e0 ff 00 20 03 00 00 c0 03 00 00 03 |....... ........| 000001d0 e0 ff 83 03 e0 ff 00 e0 06 00 00 40 1f 00 00 00 |...........@....| 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| 00000200 00 00 00 00 00 00 00 00 33 22 11 00 00 20 00 00 |........3"... ..| 00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000400 d1 00 20 40 00 00 80 87 00 00 00 00 2c f4 7f 87 |.. @........,...| 00000410 20 f4 7f 87 00 f4 7f 87 00 00 00 00 00 00 00 00 | ...............| 00000420 00 f0 7f 87 00 f0 09 00 00 00 00 00 d2 01 e8 40 |...............@| 00000430 user@machine:~/linux-maker$ hexdump -C swu_singlecopy_rescue_imx6ull_emmc_20251128.sdcard -n 1072 -s 0x400000 00400000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00400400 d1 00 20 40 00 00 80 87 00 00 00 00 2c f4 7f 87 |.. @........,...| 00400410 20 f4 7f 87 00 f4 7f 87 00 00 00 00 00 00 00 00 | ...............| 00400420 00 f0 7f 87 00 f0 09 00 00 00 00 00 d2 01 e8 40 |...............@| 00400430 以下の投稿を検索して読みました。 https://community.nxp.com/t5/i-MX-Processors/iMX6SX-Redundant-Boot/mp/715959 https://community.nxp.com/t5/i-MX-Security/Secondary-Redundant-boot-in-i-MX-6-7-8M-Family-of-Applica... https://community.nxp.com/t5/i-MX-Security/BootROM-HABv4-Redundant-boot-support-is-not-triggered-whe... しかし、解決策は見つかりませんでした。 何が間違っているのでしょうか? Re: Secondary Boot on i.MX6ULL Hangs After Reset さらにいくつかのテストを実行したところ、i.MX6ULL が mmcblk1boot0 をプライマリ ブート パーティションとして使用していることがわかりました。実際、このパーティションを破損させようとすると、システムは起動に失敗します。 パーティションの内容は次のとおりです。 root@imx6ull:~# hexdump -C /dev/mmcblk1boot0 -n 4096 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000400 d1 00 20 40 00 00 80 87 00 00 00 00 2c f4 7f 87 |.. @........,...| 00000410 20 f4 7f 87 00 f4 7f 87 00 00 00 00 00 00 00 00 | ...............| 00000420 00 f0 7f 87 00 f0 09 00 00 00 00 00 d2 01 e8 40 |...............@| 00000430 cc 01 e4 04 02 0c 40 68 ff ff ff ff 02 0c 40 6c |......@h......@l| 00000440 ff ff ff ff 02 0c 40 70 ff ff ff ff 02 0c 40 74 |......@p......@t| 00000450 ff ff ff ff 02 0c 40 78 ff ff ff ff 02 0c 40 7c |......@x......@|| 00000460 ff ff ff ff 02 0c 40 80 ff ff ff ff 02 0e 04 b4 |......@.........| 00000470 00 0c 00 00 02 0e 04 ac 00 00 00 00 02 0e 02 7c |...............|| 00000480 00 00 00 30 02 0e 02 50 00 00 00 30 02 0e 02 4c |...0...P...0...L| 00000490 00 00 00 30 02 0e 04 90 00 00 00 30 02 0e 02 88 |...0.......0....| この領域にセカンダリベクターテーブル (SVT) を書き込もうとすると、システムが起動しなくなります。SO、SVT はどこに記述すればよいのでしょうか? 私はいつも uuu を使用してシステムをフラッシュしてきました。特に、イメージ全体をフラッシュする必要がある場合は、次のようにします。 uuu -b emmc_all U-Boot のみを更新する必要がある場合は、次のようにします。 uuu -b emmc mmcblk1boot0 パーティションを作成して書き込むのは uuu だと思います。ブート手順の他の部分も変更されている可能性がありますか? Re: Secondary Boot on i.MX6ULL Hangs After Reset あなたの説明と投稿された画像に基づくと、eMMC ユーザー パーティションが破損していますが、システムは引き続き起動できます。これは、i.MX6ULL のセカンダリ ブートに eMMC ブート パーティション (boot1 または boot 2) を使用していることを示します。専用のブート パーティションが必要な場合は、準備したイメージをそこに書き込む必要があります。もちろん、eMMC ブート パーティションは十分な大きさである必要があります。あるいは、Linux の u-boot コマンドまたは mmc ツールを使用して、ブート パーティションをユーザー パーティションに切り替えることもできます。 こちらはセカンダリブート用のコレクションです。 https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/iMX-secondary-boot-collection/ta-p/1916915 https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/i-MX8MM-SDCARD-Secondary-Boot-Demo/ta-p/1500011で Windows と Linux の両方で実行できるスクリプトがあり、セカンダリ ブート イメージの作成に役立ちます。 試してみましたが、とても良いです。 soc_name: imx6(imx6ファミリ全体)、imx8mq、imx8mm Re: Secondary Boot on i.MX6ULL Hangs After Reset 奇妙なことに気付きました。次のコマンドでプライマリ イメージの IVT を破損させようとすると、 sudo dd if=/dev/zero of=/dev/mmcblk1 bs=1 seek=1024 count=32 && sync‍‍‍‍‍‍‍‍‍‍ セカンダリ U-Boot がなくてもシステムは起動します。 私が持っている mmc パーティションは次のとおりです。 root@imx6ull:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS mmcblk1 179:0 0 58.2G 0 disk |-mmcblk1p1 179:1 0 120M 0 part /boot `-mmcblk1p2 179:2 0 1000M 0 part / mmcblk1boot0 179:8 0 4M 1 disk mmcblk1boot1 179:16 0 4M 1 disk U-Boot バイナリも mmcblk1boot0 に書き込まれているようです。 システムが実際に mmcblk1boot0 に保存されている U-Boot を使用していて、そこに SIT とセカンダリ U-Boot を書き込む必要がある可能性はありますか? @Bio_TICFSL 、この点について明確にしていただけますか? Re: Secondary Boot on i.MX6ULL Hangs After Reset 16 進ダンプを見ると、オフセット 0x208 を 0x00112233 に変更し、0x20C を 0 に設定していることがわかりますが、firstSectorNumber フィールドが正しくない可能性があります。このフィールドは、セカンダリ イメージが始まるセクターを指す必要があります。 このテストでは、手順全体を検証するために、プライマリ U-Boot をセカンダリ U-Boot として使用しようとしていたため、 firstSectorNumber を0 に設定しました。 私の投稿の最後の 16 進ダンプでは、代わりに 2 つの異なる U-Boot イメージ (プライマリとセカンダリ) を使用して、より標準的なテストを実行しました。そのCASE、 firstSectorNumberは0x2000に設定されました。これは、セカンダリ U-Boot が実際に始まるオフセットに対応します: 0x2000 * 512 (つまり、ブロック サイズ) + 1024 (つまり、MBR サイズ) = 0x400400 、投稿したリンクで説明されているとおりですが、システムはリセット後もハングしたままになります。 何か見逃しているのでしょうか? Ps: あなたが投稿したこのコマンドは imx8 専用であり、imx6 には対応していないと思います。 mw.l 0x30390098 0x40000000 Re: Secondary Boot on i.MX6ULL Hangs After Reset Hello この問題は、セカンダリ イメージ テーブル (SIT) 構成に関係しているようです。eMMC を使用して i.MX6ULL の冗長ブートを実装する場合、SIT の firstSectorNumber フィールドをプライマリ ブート イメージのサイズに応じて正しく設定する必要があります。 適切なセカンダリブートの実装: 1. SIT に以下の重要な値があることを確認します。 - タグ = 0x00112233 (正しく設定されています) - firstSectorNumber = プライマリイメージのアラインサイズ/512バイト - すべての予約フィールドが適切に設定されていることを確認する 2. セカンダリ イメージが 0x1000 境界でプライマリ イメージの後に正しく配置されていることを確認します。 3.イメージをフラッシュした後、次のコマンドを使用して PERSIST_SECONDARY_BOOT フラグを設定します。 「」 mw.l 0x30390098 0x40000000 「」 16 進ダンプを見ると、オフセット 0x208 を 0x00112233 に変更し、0x20C を 0 に設定していることがわかりますが、firstSectorNumber フィールドが正しくない可能性があります。このフィールドは、セカンダリ イメージが始まるセクターを指す必要があります。 プライマリ U-Boot イメージのサイズ (適切に調整) に基づいて firstSectorNumber を再計算し、セカンダリ ブート イメージが正しいオフセットに配置されていることを確認してください。セカンダリ イメージは、プライマリ イメージが終了した後のセクター境界から開始する必要があります。 冗長ブートの実装に関する詳細は、次のコミュニティドキュメントを参照してください。 https://community.nxp.com/t5/i-MX-Security/Secondary-Redundant-boot-in-i-MX-6-7-8M-Family-of-Application/ta-p/1117103 よろしくお願いします。 Re: Secondary Boot on i.MX6ULL Hangs After Reset   前述したように、セカンダリ ブートは使用パーティションだけでなくブート パーティションでも機能する必要があります。   eMMC ブート パーティションが十分な大きさの場合は、次の 2 つのコマンドを試して、セカンダリ ブートの flash.bin (flash_secondary_boot.bin) をブート パーティションに書き込むことができます。   uuu emmc uuu emmc [flash_secondary_boot.bin] 注: ここでのflash.binは通常使用するプライマリブートイメージのみです。uuuヘルプを確認してください。 uuu [-d -m -v -bmap -no-bmap] -b[run] arg... Run Built-in scripts emmc burn boot loader to eMMC boot partition arg0: _flash.bin bootloader arg1: _image[Optional] image burn to emmc, default is the same as bootloader   前に提供したリンクのスクリプトを使用して、セカンダリ ブート イメージを作成CAN。   プライマリ イメージを完全にゼロで構成されたファイルに置き換えることで、プライマリ イメージの破損をシミュレートCANできます。   https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/i-MX8MM-SDCARD-Secondary-Boot-Demo/ta-p/ ...   https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/iMX-secondary-boot-collection/ta-p/19169 ... Re: Secondary Boot on i.MX6ULL Hangs After Reset @kawateb265 さんのご回答のおかげで、ようやく問題を解決できました。imx6 は boot0 パーティションから起動していました。ユーザー パーティションから起動するには、u-boot で次のコマンドを実行する必要がありました。 => mmc partconf 1 1 7 0 EXT_CSD[179], PARTITION_CONFIG: BOOT_ACK: 0x1 BOOT_PARTITION_ENABLE: 0x7 PARTITION_ACCESS: 0x0 ここで '0x7' はユーザー パーティションを有効にします。説明は次のとおりです: https://docs.u-boot.org/en/v2025.01/usage/cmd/mmc.html#:~:text=0x7,boot この変更を適用すると、「md.l 20D8044 1」によるテストは正常に動作し、リセット コマンド後にセカンダリ U-Boot が起動します。 Re: Secondary Boot on i.MX6ULL Hangs After Reset ご説明ありがとうございます。 私の場合、前のメッセージの lsblk 出力に示されているように、Yocto が自動的に作成したと思われる 2 つのブート パーティション、「mmcblk1boot0」と「mmcblk1boot1」があります。 スクリプトによって生成されたバイナリを mmcblk1boot0 に配置する必要がありますか? もしSOなら、mmcblk1boot1 の目的は何ですか? Re: Secondary Boot on i.MX6ULL Hangs After Reset コレクション全体を読むと、i.MX8QXP eMMC セカンダリ ブートの 2 つのブート パーティションが相互にバックアップされていることがわかります。ただし、i.MX8MM と iMX6 のブート パーティションは相互にバックアップされておらず、一方が独立しています。 https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/iMX-secondary-boot-collection/ta-p/1916915 https://community.nxp.com/t5/NXP-Tech-Blog/i-MX8QXP-eMMC-セカンダリブート/ba-p/1257704#M45
查看全文
恩智浦 s32k312 SRAM 多位错误 @danielmartynek 对于单位错误,我可以调用 SRAM ISR(ERM0_ISR_Handler),但对于多位错误,却无法调用处理程序。 据我所知,不可纠错事件与多位错误相对应,对吗? 我可以看到 SRAM 不可更正的错误事件位是在 SR0 中设置的,但是 ISR 没有被触发信号。 能否请您帮助我了解如何调用多位错误 ISR? 我还在 CR0 寄存器中启用了 SRAM0 的中断通知功能 Re: NXP s32k312 SRAM MultibitError 你好,@Anitha7、 不可纠正的错误会触发信号 CM7 故障异常。 在我链接的示例中,我启用了 Bus_Fault 异常,但其优先级低于 ERM 处理程序的优先级,这样 ERM 处理程序就会首先被调用。 我认为这可能是您项目中的问题所在。 此外,请仔细检查 VTOR 指针,并确保在 NVIC 中启用 ERM 中断。您可能会注意到 NVIC 中的中断待处理。 Re: NXP s32k312 SRAM MultibitError 你好@丹尼尔-马蒂内克 多比特是指 RM 规定的双比特 我根据你的参考将系统配置为 SRAM0。通过设置 SRO 寄存器中的相应位,可避免发生无法纠正的 ECC 故障(NEC0)。 我在相应的 CR0 寄存器中启用了 NEC0 和单比特事件的中断通知。 发生不可纠正的 ECC 故障后,控制权转移到系统调用功能,此后直到我执行 RESET 后,软件才能运行。尽管我已经添加了 ERM_1_Hand ler ,但它没有被触发。对于单位错误, ERM_0_H andler 会被正确触发信号。 我该如何确保 ERM_1_Handler 在发生多位(不可纠正)ECC 错误时被调用? 另外,我想确认一下,多位错误(双位错误)是否总是表示出现了无法纠正的 ECC 故障? 发生不可纠正的 ECC 事件后,我需要在正常模式下在 ECU 中执行 RESET 运行 Re: NXP s32k312 SRAM MultibitError 你好,@Anitha7、 多位错误是什么意思? 64 位(8 字节)的数据有一个 8 位校验和,不可能检测到所有可能的 ECC 错误。有 ECC SECDED(单错误纠正,双错误检测)。 此致, 丹尼尔 Re: NXP s32k312 SRAM MultibitError 你好@丹尼尔-马蒂内克 VTOR 表仅在 SRAM0 注入无法纠正的 ECC 故障时指向闪存。 我根据您的参考示例代码将系统配置为 SRAM0。通过设置 SRO 寄存器中的相应位,可在发生不可纠正的 ECC 故障时自动恢复 ECC。 我在相应的 CR0 寄存器中启用了中断通知功能。 发生不可纠正的 ECC 故障后,控制权转移到系统调用功能,之后软件将无法运行,直到我执行 RESET。尽管我已经添加了 ERM_1_Handler,但它没有被触发信号。对于单位错误,ERM_0_Handler 会被正确触发。 我该如何确保在发生多位(不可修正)ECC 错误时调用ERM_1_Handler? 另外,我想确认一下,多位错误是否总是表示无法纠正的 ECC 故障? Re: NXP s32k312 SRAM MultibitError 你好,@Anitha7、 我更新了示例,在 SRAM0 中加入了不可纠正的错误注入。 https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K344-EIM-ERM-DTCM-SRAM-Baremetal-v3-0-S32DS36/ta-p/2193534 您能在应用程序中读取 VTOR 寄存器吗? 在内存中注入无法纠正的 ECC 故障时,中断向量表不得位于 SRAM0 中。 否则,ECC 故障会在获取过程中损坏矢量表,导致另一个故障异常。 此致, 丹尼尔
查看全文
CLRC66301B 掉电模式仍消耗 2 mA 而不是 nA 您好,恩智浦社区 我正在使用 CLRC66301B NFC 读卡器IC 并尝试通过将 PDOWN 引脚设为高电平来激活掉电模式 (3.3)V),详见数据手册。但是,电流消耗保持在2 mA,而数据表显示掉电时电流消耗应在8 nA至40 nA之间。 设置详情: PDOWN 引脚:3.3 V(恒定高电平) VDDs:VDD(TX)、VDD(AUX)、VDD(MCU)电压均为 3.3 V 接口:I²C(测试期间空闲) XTAL:连接 27.12 MHz 晶体 当前测量期间无通信或活动 测量电流: ~2 mA 问题 1.在断言 PDOWN 之前是否需要对寄存器进行配置? 2。IRQ、XTAL、IFSEL 或其他 GPIO 能否阻止进入真正的掉电模式? 3.PDOWN 是否需要使用 VDD 或 RESET 进行额外的定时或排序? 如有任何见解或建议,我们将不胜感激。 谢谢! 乌玛桑卡尔 NFC 控制器解决方案 Re: CLRC66301B Power-Down Mode Still Consumes 2 mA Instead of nA 您好, 当您提到当 SDA 和 SCL 物理断开时电流消耗会降低时,是指您移除了该引脚上的所有连接(同时移除主机 MCU 和上拉电阻器),还是指这些线路仅与主机 MCU 断开? 另外,能否请您描述一下测量所用的方法、设备和测试点? Eduardo。 Re: CLRC66301B Power-Down Mode Still Consumes 2 mA Instead of nA 亲爱的恩智浦团队 我使用带有 CLRC66303B 芯片的官方 CLEV6630ARD 板进行了掉电电流测试。只有在进行任何 I²C 通信之前物理断开 SDA 和 SCL 时,电流才会达到 ~40 nA。如果使用一次 I²C,即使将 PDOWN 设为高电平,电流也会保持在 2 mA 以上。 请说明在进入 PDOWN 之前,I²C 线路应该做些什么?具体来说 在断言 PDOWN 之前,MCU 是否应将 SDA 和 SCL 设置为高阻抗(输入,无拉)? 之前的任何 I²C 通信是否会阻止芯片进入真正的硬掉电? 谢谢! Follow-Up: CLRC66303 – High Current in Hard Power-Down Mode (CLEV6630ARD-Based Design) 亲爱的恩智浦团队 我之前曾就 CLRC66301HN 的硬掉电电流提出过问题,你的回复建议迁移到 CLRC663 Plus 系列 (CLRC66303)。此后我改用 CLRC66303B,使用基于 CLEV6630ARD 参考设计的定制板,我想继续提供最新的测试结果。 你之前的回复侧重于 LPCD 行为和 AN11783,但这个问题仅涉及通过 PDOWN 引脚进行硬掉电,没有RF场或 LPCD 处于活动状态。 掉电电流测量 (CLRC66303B): > 当 PDOWN 处于低电平时(芯片处于活动状态,RF场 开启):~100 mA >当 PDOWN 为高电平且存在 I²C 上拉时:~1.2 mA >当 PDOWN 为高且 I²C 线路被驱动为低时: ~6.6 mA >当 PDOWN 为高电平且 I²C 线路在使用前已物理断开时:~40 nA 只有在进行任何 I²C 通信之前物理断开 SDA 和 SCL 连接时,芯片才会在 PDOWN 模式下消耗 ~40 nA 电流。如果只使用一次 I²C,则即使在 PDOWN 钳位高电平之后,电流仍保持高电平。 硬件设置摘要: 芯片:CLRC66303B,I²C 模式。 微控制器:TI CC2652R7,100 kHz I²C 电压:3.3 V 调节 上拉:SDA/SCL 上 4.7 kΩ 至 3.3 V 未使用的引脚:按照数据表拉动 未启用射频或 LPCD 功能 方案设计:基于 CLEV6630ARD(附后) 需要澄清的问题: 1.在 PDOWN 模式期间,SDA/SCL 是否内部偏置? 2。即使后来将PDOWN设置为高电平,之前的任何I²C活动是否会阻止真正的掉电? 3.在断言 PDOWN 之前,是否有必要将 MCU I²C 引脚设置为 Hi-Z(输入,无拉)? 4.是否有恩智浦推荐的方法,可在硬 PDOWN 模式下可靠地实现<100 nA,而无需物理断开 I²C 线路? 我们的目标是确保电池的使用寿命,并且必须实现数据手册中规定的低功耗性能。如果有任何专门关于 PDOWN 行为和 I²C 漏电流的指导或文档,我们将不胜感激。 附上示意图以供参考。 顺祝商祺! Umasankar C Re: CLRC66301B Power-Down Mode Still Consumes 2 mA Instead of nA 你好@Umasankarc 希望你一切顺利。 我知道你使用的是基于 CLRC66301HN(非增强版)的自定义板,对吗?如果是,请考虑我们建议改用 CLRC663 plus 系列 (CLRC66303)。 引脚 PDOWN 的高电平应启用硬掉电。数据手册中描述的掉电电流 (Ipd) 相当于 CLRC663 芯片中所有电源电流的总和;但是,嵌入在板中的外部元器件可能会消耗额外的功率。 AN11783 CLRC663 plus《电源卡检测》第 3.4 节中描述了一些低功耗设计建议。 Eduardo。
查看全文
S32K 示例 S32K1xx S32K144 示例 S32K144 CMP 轮询 S32DS2.0 示例 S32K144 验证后门访问密钥 S32DS1.3 示例 S32K144 FlexCAN0 RXFIFO DMA nonSDK S32DS13 示例 S32K144 PDB ADC 触发 DMA ISR S32DS 示例 S32K144 Flash RW simple S32DS 示例 S32K144 DMA 内存复制测试 S32DS S32K144 EEEPROM 使用示例 示例 S32K144 EEEPROM 使用 - 无 SDK 示例 S32K144 RTC VLPS 示例 S32K144 WDOG RCM 中断 示例 S32K144 SRAM ECC 注入  S32K144 RAM 保留示例 S32DS.R1 示例 S32K144 I2C主设备 MPL3115A2 S32DSR1_v3 示例S32K144 FlexCAN RXFIFO DMA S32DS.ARM.2018.R1  示例 S32K144_printf_implementation - S32DS_1.0 示例 S32K144 在 FreeRTOS 下使用 UART printf/scanf - S32DS 示例 使用 LPIT 定时器实现可配置周期函数调用的 S32K144 SDK 示例 S32K144 .noinit章节用法 示例 S32K144 PDB ADC DMA S32DS.ARM.2018.R1 示例 S32K144 RAM 自检简单 S32DS 2018.R1 示例 S32K144 位置无关代码  示例 S32K144 FlexCAN 虚拟网络停止模式测试 S32DS.ARM.2.2 示例 S32K144 LPIT DMA LPSPI 示例 S32K144 FlexCAN TX/RX/Error ISR 测试 S32DS2.2 示例 S32K144 FlexIO 空闲检测 S32DS2.2 S32K146 示例 S32K146 Set_whole_FlexRAM-as_RAM S32DS.ARM.2.2 S32K148 示例 S32K148 PDB0-PDB1 环 S32DS3.4 RTM4.0.3 示例 S32K148 PDB0-PDB1 环 DMA S32DS3.4 RTM4.0.3 示例 S32K148 GPIO 中断 S32K116 示例 S32K116 WDOG 快速测试 示例 S32K116 LPUART LIN 从机 TXRX ISR S32DS.ARM.2.2 示例 S32K116 FlexCAN PN 停止 S32DS.ARM.2.2 示例 S32K116 FlexCAN VLPR 测试 S32DS.ARM.2.2 S32K118 示例 S32K118-SRAM-keep_data_over_SW_reset v0_1 S32DS.ARM.2.2 S32K3xx S32K344 示例 S32K344 PIT BTCU ADC DMA DS3.4 RTD100   示例 S32K344 FlexCAN_Ip TX/RX/EnhanceRXFIFO 测试 S32DS3.4 RTD200   示例 Siul2_Port_Ip_Example_S32K344_ITCM_DTCM S32DS3.4RTD300   示例 S32K358 FlexCAN TXRX ISR S32DS35 RTD400/500    
查看全文
MPXV5004 Sensor Application question HI, I'm from a Commercial Glass & Dishwasher manufacture & we are looking at replacing our old diaphragm based pressure switches to the MPXV5004 pressure sensor with our control board, with reading the Datasheet it says: "Internal reliability and qualification test for dry air, and other media, are available from the factory. Contact the factory for information regarding media tolerance in your application". so my question is we can provide clean air to the sensor through an Air-Bell, but it wont be dry it will have around 60-70% humidity as we use hot water in the machines. will this affect the sensors reliability or longevity? If so, are there other sensors that could be used? or a recommended way that we could connect the tube from the Air-Bell to the pressure sensor?. Thanks Damien Pressure Sensors Re: MPXV5004 Sensor Application question Hello Damien, Thanks for using our community. You could protect the sensor using a high viscosity silicone. Please, take a look at the following thread: Re: 30% of MPXM2202GS failed within 2 months after installation -Josh
查看全文
ST7701 驱动程序 Hello 我正在尝试与 ST7701 显示控制器通信。 是否有一些例子?如果可能的话,谁能分享一下? 我使用的是 i.MX RT1170 板。在 SDK 示例中,我找到了 HX8394、RM68191 和 RM68200 显示控制器的驱动程序。我想为 ST7701 找到类似的东西。 谁能帮帮我? 谢谢,并致以诚挚的问候、 弗朗切斯科-索利托 Re: ST7701 drivers 你好,@SolitoFrancesco、 目前,我们的 SDK 中没有任何针对ST7701 显示控制器 的驱动程序支持。 与该控制器的集成必须手动完成。 必须调整 LCDIF 模块的分辨率值、同步信号和时钟频率,以便与显示控制器兼容。如果使用 EVK,则可以使用 SDK 驱动程序并调整以下功能的值: BOARD_InitLcdifClock() BOARD_InitMipiDsiClock() BOARD_SetMipiDsiConfig() 这些函数以及同步值的宏都在 " display_support.c " 中引用文件,这是调整显示控制器支持时需要关注的主要文件。   另外,请务必阅读以下应用笔记,因为它详细介绍了液晶显示器设置的工作原理以及其他有用的注意事项:i.MX RT elcDIF RGB 模式用例 (nxp.com)   BR, Edwin. Re: ST7701 drivers 早上好 我按照显示器制造商和驱动程序制造商的指示,修改了你提到的文件。我可以通过 MIPI 对驱动寄存器进行写入和读取。我可以用示波器看到差分 MIPI 波形(也是在"配置" 阶段之后),但仍然无法在显示屏上看到任何东西。我正在使用恩智浦 SDK 中名为"mipi_dsi_compiance_test" 的演示示例。 您能提供更多帮助吗? 谢谢,并致以诚挚的问候、 弗朗切斯科-索利托 Re: ST7701 drivers 你好,@SolitoFrancesco、 您能在运行时调试代码吗?是否打印出任何错误信息?您在数据线上看到了哪些数据模式?这些模式是否与 readme.md 文件中描述的预期模式一致? BR, Edwin. Re: ST7701 drivers 你好 我也遇到了同样的情况(相同的驱动程序和分辨率,基础是在开发板上运行的测试示例)。控制器已配置好,我也可以读取状态(没有任何错误),DSI 线路上的数据也已存在,但屏幕上什么也没显示。 将 dsi_dpi_config 中的 videoMode 从 kDSI_DpiBurst 改为其他模式也没有效果。 看起来屏幕不接受视频流? Re: ST7701 drivers 你好示例项目在显示 DEMO_PANEL_RK055MHD091 时运行正常。然后,我切换到最终应用中必须使用的面板。它的分辨率不同(480x800),因此我调整了定义。然后,我更改了驱动程序(fsl .h和 .c文件),我就能与显示器通信了。我可以写入和回读寄存器。但在配置显示屏后,当示例项目开始发送图像缓冲区时,我能在示波器上看到 MIPI 波形,但显示屏上什么也看不到。假设显示屏没有损坏,因为我尝试通过专用命令打开所有像素,我可以看到屏幕完全白色。我不明白的是,问题是出在显示器的配置上,还是出在示例项目中我必须调整的其他地方。我联系了显示器制造商和控制器制造商,但我需要各方尽可能多的帮助。有可能为安装在显示器上的控制器获取 fsl 驱动程序吗?它是 Sitronix ST7701。请告诉我。谢谢并致以诚挚的问候,弗朗切斯科 Re: ST7701 drivers 您好,Rino 我正在对我的设置和您的设置进行比较(最后我会上传到这里)。 同时,我注意到我使用的是 ST7701,而你使用的可能是 ST7701S(后缀为 S)。我认为它们很相似,但我不确定。 我注意到,现在即使不进行任何初始化,显示屏也能正常工作。"开始时速度很慢," ,硬度也很低,但还是能用。然后,如果我只发送 0xE0 至 0xEF 的设置(ST7701 数据表中没有记录),显示器启动速度非常快,颜色也正确。似乎所有其他设置都没有必要(听起来很奇怪)。 让我们保持联系。完成后,我将与大家分享比较结果。 再次感谢您。 亲切的问候, Francesco Re: ST7701 drivers 你好,Rino 非常感谢你的建议。在我的应用中似乎也是如此。好极了我可能需要更好的设置,但现在我可以在屏幕上看到图像了。 如果可能的话,请与我分享您的配置,以便我与您的配置进行比较,更好地完善配置。如果我看到了不同的东西,我会在这里告诉你。 再次感谢您。您是如何设置 enableNonContinuousHsClk 的? 致以亲切的问候, Francesco Re: ST7701 drivers 你好,弗朗切斯科 、 我设法让显示屏正常工作。 在 DisplayTFT_SetMipiDsiConfig 函数中,添加一行内容: dsiConfig.enableNonContinuousHsClk= true; 例如,在这几行之后: DSI_GetDefaultConfig(&dsiConfig); dsiConfig.numLanes = DISPLAY_MIPI_DSI_LANE_NUM; dsiConfig.autoInsertEoTp= true; 假设你已经正确配置了显示 IC(如果有必要,我可以分享我的屏幕配置)和显示时钟(我的设置大约是 26MHz)。 致以最诚挚的问候,克里斯 Re: ST7701 drivers 你好 文件是根据 SDK 中的其他驱动程序创建的。 您还可以将延迟时间改为更短。 今天上午,我确认了配置顺序,并按照显示器制造商的建议做了一些更改,但没有进一步改善,于是我开始仔细研究 DSI 配置本身。我知道时钟很好,视频模式(突发模式)也是如此,所以剩下的唯一选择是 DSI 本身的选择。 熟悉(以及文档中的其他部分): https://docs.nxp.com/bundle/AN13573/page/topics/continuous_vs_non-continuous_clock.html BR, Chris Re: ST7701 drivers 你好,里诺 按照约定,请在附件中查看您和我的设置对比。我没有细说,但如果我或你会在差异中发现一些有趣的东西,请让我们继续写下去。 此致敬礼, 弗朗西斯科 Re: ST7701 drivers 你好,弗朗切斯科、 抱歉耽搁了。 我浏览了你的对比,发现了很多差异,部分原因是屏幕本身(我们有玻璃/触摸屏/屏幕三明治,对此进行了配置修复——或者至少供应商是这样解释的) 🙂 )。 有些设置(如功率控制)不是启动所必需的,而是为了提高质量(对比度/伽玛设置)。 有趣的是,无论我们是否运行"Sunlight Readable Enhancement" 这个东西,我想他们称之为 "阳光可读增强",都是必需的。根据这些数据,它可以自动设置最佳参数。如果它们不正确或缺失(默认值),则需要一段时间才能自动设置它们 -> 因此,正如你所注意到的,启动速度会很慢。 文档本身可能相当令人恼火,许多命令都没有文档说明,如果没有文档,往往无法完全启动屏幕。不只是这款机型,我在其他几款态龙机型上也遇到过这种情况。 亲切的问候, Chris
查看全文
IMX8M PLUS LPDDR4 2G 兼容性 我们尝试使用 ISSI IS43LQ32512A-046BLI 2GB RAM。校准后,在配置为 2000MHz 的memcpy SSN armv8_x32 测试中,RAM 出现故障。 如果我将内存配置为 1500MHz,它就能通过所有测试。 有人使用过这种 LPDDR4 内存吗?它与 IMX8M PLUS 兼容吗? i.MX 8 系列 | i.MX 8QuadMax (8QM) | 8QuadPlus i.MX 8M | i.MX 8M Mini | i.MX 8M Nano Re: IMX8M PLUS LPDDR4 2G compatibility 你好@TMpieye 您是否使用 DDR 配置工具运行校准?如果是,.请共享您的配置页面和故障日志文件。 B.R Re: IMX8M PLUS LPDDR4 2G compatibility IS43LQ32512A-046BLI(ISSI 2GB LPDDR4X 同步动态随机存取存储器(SDRAM))通常与恩智浦 i.MX 8M Plus 处理器兼容,前提是它符合 LPDDR4/LPDDR4X 内存的 JEDEC 标准。但是,你的memcpy SSN armv8_x32测试在2000MHz(但通过了 1500MHz)时失败的问题并不少见,可能源于配置、板设计或校准方面的挑战,而不是根本的不兼容性。 兼容性确认 i.MX 8M Plus 支持高达 4266 MT/s(2133MHz 时钟)的 LPDDR4/LPDDR4X 内存,IS43LQ32512A-046BLI 工作频率高达 2133MHz(4266 MT/s 数据速率),与恩智浦的规格一致。 恩智浦的社区论坛证实,类似的 ISSI LPDDR4X 部件(例如,IS46LQ32512A-046BLA2,这是您的型号的汽车变体)与 i.MX 8M Plus 兼容,前提是它们遵循 JEDEC 规范。只要配置得当,用户都能顺利实施。 导致 2000MHz 频率测试失败的潜在原因 根据恩智浦和嵌入式论坛上的类似报告: 定时/配置不匹配:i.MX 8M Plus DDR 控制器需要 RAM 的 SPD/数据表提供精确的时序参数(如 CAS 延迟、tRCD、tRP)。在 2000MHz 时,您的校准可能无法完全优化 ISSI 部件的规格(例如,在更高的速度下,CL=32,RL=14)。将频率降至 1500MHz 可降低压力和通过率,但这表明调谐未达到最佳状态。 板设计问题:信号完整性问题,如走线长度不匹配、阻抗错误或功率解耦不足,可能会导致较高速度失效。使用示波器检查 DQ/DQS 线路上是否有反射或噪音。 校准限制:i.MX 8M Plus 使用恩智浦的 DDR 工具进行校准。如果您的脚本或设置基于 Micron/Samsung 参考(在 EVK 中很常见),则它们可能与 ISSI 的特征不符。使用 ISSI 专用参数重新运行校准。 功率/温度:在 2000MHz 时,较高的电流消耗可能会导致电压下降或过热,从而使 memcpy 测试(强调顺序读/写)失败。 有人使用过这种内存吗? 是的,有记录的实施方案: 在恩智浦社区话题中,用户已将类似的ISSI LPDDR4X(例如 IS46LQ 系列)集成到用于工业应用的定制i.MX 8M Plus板上,在微调后实现了高达2133MHz的稳定运行。 嵌入式Linux/电路板支持包开发人员报告说,在基于Yocto的版本中成功使用了ISSI部件,但通常使用自定义的DDR初始化脚本来处理512M x 32的组织(16Gbit密度)。 解决问题的建议 验证数据表对齐: 下载ISSI数据表(IS43/46LQ32512A系列),将时序参数与恩智浦的i.MX 8M Plus RM(参考手册,第13.5节DDR控制器)进行比较。 内存的主要规格:2133MHz 最大时钟、LVSTL 接口、1G x 16 组织(双通道 x32 总计)。 重新运行校准: 使用恩智浦的DDR 测试工具或SCFW DDR 配置工具进行 ISSI 特定压力测试。 从 1600MHz 开始,逐渐增加到 2000MHz,同时监测眼图。 如果使用 U-启动/Linux,请使用正确的时间更新设备树 (.dtb)(例如 mx8mp-ddrc-devfreq.dtsi)。 董事会级别的检查: 确保 VDDQ = 1.1V、VDD2 = 0.6V,采用干净的解耦(电容靠近引脚)。 使用信号完整性模拟器(如 HyperLynx)验证迹线。 用更低的温度或更好的冷却方式进行测试,以排除热节流。 如果仍然失败 通过恩智浦的社区或票务系统联系恩智浦支持人员——提供您的校准日志和电路板原理图。 考虑改用美光 MT53E512M32D2NP(恩智浦 EVK 默认值)等经过验证的内存进行比较。 总的来说,内存是兼容的,但你的 2000MHz 故障很可能是设置问题。如果你分享更多细节(例如校准日志或电路板原理图片段),我可以帮助进一步排除故障! 我建议通过消息应用程序联系 +8526583 (7594);从他那里获得 EOL 文件,然后提出建议。他能帮助你 Re: IMX8M PLUS LPDDR4 2G compatibility 感谢你的支持 在附件中,我向您发送了配置文件 .xls和测试日志。 Re: IMX8M PLUS LPDDR4 2G compatibility 在二手板上,我们成功地在 2000MHz 上运行了 3GB(MT53E768M32D2ZW-046 WTC)和 4GB(MT53E1G32D2FW-046 AAT: B)美光 LPDDR4。 Re: IMX8M PLUS LPDDR4 2G compatibility 你好@pengyong_zhang、 使用配置工具 V 13.1 时结果相同。也许我们对 IS43LQ32512A-046BLI 的配置有误?能否提供正确的配置(*.ds 文件)?我们的硬件设计是关于 LPDDR4 接口的评估板的 1:1 副本。 此致 托比亚斯 Re: IMX8M PLUS LPDDR4 2G compatibility 你好@TMpieye 请使用以下链接下载我们的 DDR 配置工具,然后使用 configure 2GB 动态随机存取存储器(DRAM) 运行 ddr 测试。 https://www.nxp.com/design/design-center/development-boards-and-designs/i-mx-evaluation-and-development-boards/config-tools-for-i-mx-applications-processors:CONFIG-TOOLS-IMX B.R Re: IMX8M PLUS LPDDR4 2G compatibility 你好@TMpieye 请使用以下设置运行 DDR 测试。 B.R Re: IMX8M PLUS LPDDR4 2G compatibility 感谢您的配置示例。我已经用这个内存试过了,还是出错。 Re: IMX8M PLUS LPDDR4 2G compatibility 你好@TMpieye 真奇怪。请分享您的 DDR 配置工具 v25.12 故障日志 B.R Re: IMX8M PLUS LPDDR4 2G compatibility 你好@TMpieye 您使用我们的 DDR 配置工具进行压力测试了吗?从你的日志文件来看,配置工具的输出结果似乎与之不符。同时使用最新的工具版本 v25.12。 B.R Re: IMX8M PLUS LPDDR4 2G compatibility 你好@pengyong_zhang、 这是 Stresstest 的日志。我们的 4GB ISSI IS43LQ32K01S2A-046BLI 也遇到了同样的问题。 Re: IMX8M PLUS LPDDR4 2G compatibility hi@pengyong_zhang 我们使用 Mscale DDR 工具 3.31 进行stresstest。我将使用其他配置工具进行配置 Re: IMX8M PLUS LPDDR4 2G compatibility 你好@pengyong_zhang、 我在配置工具中运行测试,结果通过了。因此,这似乎是 MSCALER 工具的问题。非常感谢你们的大力支持!
查看全文
S32K3XXドライバ構成 S32K3XXシリーズチップの新規構築プロジェクトについてお伺いします。ドライバを使用する際に、各ドライバ(各ドライバタイプはポジション1に対応)の設定インターフェースにある各設定項目(ポジション3に表示)について解説したドキュメントやチュートリアルはありますか?実際のエンジニアリングアプリケーションでは、どのような情報を参考に設定すればよいでしょうか?設定するたびに設定項目名を見て機能を推測し、設定内容を決めています。公式の根拠が不足しているように感じ、それぞれの設定が非常に不確実で根拠がないと感じています。 Re: S32K3XX的drivers配置 こんにちは@Aaron_LL AN13435 の次のセクションでは、さまざまなコンポーネントについて説明します。 さらに、公式 Web サイトには周辺機器の設定トレーニング チュートリアルが多数用意されており、そこから見つけることができます。 https://www.nxp.com/products/S32K3
查看全文
中子转换后的 YOLOv8n 模型无法在 i.MX95 中正常输出 您好, ,我从 ultralytics 导出了完全量化的 int8 YOLOv8n 物体检测模型。我已经使用最新的 eIQ Toolkit 版本 1.17 中的中子变流器将其转换成在 NPU 上运行,我曾尝试在 i.MX95 硬件上执行它。 我用 NPU 委托试过转换模型和非转换模型,但似乎只有转换模型上的中子图才能在 NPU 上执行。 当我比较两个模型的原始输出时,转换后的模型给出了多个假阳性,得分超过 95% 。我对已转换和未转换的模型都使用了相同的脚本,但只对已转换的模型有问题。我用多种方法进行了验证,但每次的结果都一样。 当我用 netron 应用程序检查这两个模型时,我发现转换后的模型在结构上发生了重大变化。 在此,我想问几点: 1.eIQ Toolkit 版本 1.17 的 Neutron 变流器是否支持像 YOLOv8 和 YOLOv11 这样的最新物体检测架构? 2.您在 i.MX95 上使用 NPU 测试过 YOLOv8 和 YOLOv11 吗?如果回答为 "是",请将模型和后处理步骤一并发送到 3.如果我们要在 i.MX95 中的 Neutron NPU 上执行 Neutron Graph 以外的操作,流程是什么? 4. 如果我们要在 i.MX95 中的 GPU 上执行上述模型,流程是什么? 我也翻阅了《机器学习用户指南》,但没有找到相关细节。 谢谢, Vatsal。 Re: Neutron Converted YOLOv8n model is not giving proper output in i.MX95 你好 您遇到的 Neutron 转换 YOLOv8n 模型误报问题是一个已知的难题。目前 i.MX95 NPU 对 YOLOv8 模型的支持仍在优化中,转换过程中的架构变化可能会影响性能。 关于您的具体问题: 1. eIQ 工具包 1.17 中的 YOLOv8 架构支持仍在改进中。推荐的转换工作流程是: - 在导出模型时确保正确的 int8 量化 - 使用最新的 eIQ 工具包 (v1.17) 使用变流器进行转换 - 命令:`./变流器 --input [你的模型].tflite`--target imx95 --use-python-prototype` 2.虽然支持 YOLOv8,但可能尚未完全优化。YOLOv5 与当前的 NPU 实现具有更好的兼容性。恩智浦团队正在积极改进对 YOLOv8/YOLOv11 的支持。 3. 要在 NPU 上执行 Neutron Graph 以外的操作,需要使用 eIQ 或 netron 工具分析模型,以确定哪些运算符已成功转换为在 NPU 上运行(显示为 neutronop 内容)。未转换的运算符将在 CPU 上运行。 4.在 i.MX95 上执行 GPU 运算时,应使用 TensorFlow Lite GPU 委托而不是 NPU 委托。这需要修改推理代码以使用 GPU 委托。 您可以通过在 netron 中检查转换后的模型来验证模型操作的分布情况--任何含有"neutronop" 内容的运算符都在 NPU 上执行,而其他运算符仍在 CPU 上执行。 此致 Re: Neutron Converted YOLOv8n model is not giving proper output in i.MX95 我们再次使用带有自定义数据集的YOLOv5s进行了训练,并尝试进行推断,因为您在之前的聊天中声称YOLOv5使用中子变流器取得了不错的结果。YOLOv5 也仍然存在这个问题。我也附上结果以供参考。在这里,我们尝试了已转换和未转换的 int8 tflite YOLOv5s 模型。 现在,如果你声称 YOLOv5 能够带来良好的效果,那么为什么不与我们分享经过验证的模型呢?请分享从导出、量化到转换的所有步骤,以及后期处理的步骤。这样我们就可以验证您的模型,并在我们这里复制您所遵循的步骤。 如果可以的话,也请与i.MX95共享您的基准测试和我的数据。 Re: Neutron Converted YOLOv8n model is not giving proper output in i.MX95 你好,@Bio_TICFSL! 我注意到恩智浦团队建议使用 --use-python-prototype 标志,但是我的中子变流器无法识别它。它是在 Windows 上支持的,还是只与 Linux eIQ 版本兼容? Re: Neutron Converted YOLOv8n model is not giving proper output in i.MX95 这对我来说也是一个问题。我使用过 Linux eIQ,但效果不佳。因此我跳过了它,尝试只通过目标 arg 转换模型。 Re: Neutron Converted YOLOv8n model is not giving proper output in i.MX95 您好@Bio_TICFSL, 由于时间已久,我仍在等待您的回复。我们被困在这里,我们也有一些紧迫感。请尽快回复。 谨致 Vatsal [i.MX95 NPU] YOLOv5n/v8n/v11n Neutron-converted Models Run but Return No Detections (Zero Output) 问题描述 我正在使用 Neutron 变流器在 i.MX95 NPU 上评估 YOLO 目标检测模型。 虽然 INT8 量化的 TFLite 模型在 Cortex-A55 CPU 上运行成功并能检测到物体,但编译后的 neutron.tflite 版本在卸载到 NPU 时,尽管执行推理时没有崩溃,却产生了零检测结果(空/无输出)。 环境及硬件设置   硬件: i.MX95 19x19 LPDDR5 EVK(A1 版本) 操作系统/内核: Linux 6.12.34-lts-next-gbe78e49cb433 #1 SMP PREEMPT (aarch64) NXP 工具链: MCU-SDK v25.09.00 + Linux 6.12.34_2.1.0 测试型号: YOLOv5nu、YOLOv8n、YOLOv11n(Ultralytics) 工作流程步骤和使用的命令 1. 量化(Ultralytics 导出) 模型导出为 INT8 全整数量化格式,分辨率为 320x320: yolo export model=yolov8n.pt format=tflite int8=True imgsz=320# (Repeated identically for yolov11n.pt and yolov5nu.pt)   状态:在CPU上运行完美。yolovXn_full_integer_quant.tflite 在 A55 内核上能够正确检测对象。 2. 中子汇编 TFLite 模型是使用 MCU_SDK_25.09.00+Linux_6.12.34_2.1.0 中的 Neutron 转换器为 i.MX95 NPU 编译的: ./neutron-converter --input yolov8n_full_integer_quant.tflite --target imx95 --output yolov8n_full_integer_quant_neutron.tflite   状态:无法在 NPU 上检测到对象。编译后的模型可以加载并运行推理,不会抛出语法或执行错误,但对于完全相同的测试图像,输出张量返回零检测结果。 观察到的症状和疑似根本原因   操作回退:变流器是否会针对特定的 YOLO 层(如自定义锚点、SiLU/Swin 激活或非最大值抑制)回退到 CPU? 量化缩放/不对称性:通过 Ultralytics 导出的 YOLO 模型通常使用不对称量化或具有 Neutron NPU 驱动程序可能误解的特定输出张量缩放。 输出张量格式:推理运行正常,这表明输入管道没有问题,但输出边界框/分数要么为空白,要么完全是垃圾值。 向恩智浦专家提问   中子变流器是否存在针对 Ultralytics YOLO 架构的已知限制或必需的优化标志? 在将 TFLite 模型传递给 Neutron 转换器之前,是否应该去除 NMS(非极大值抑制)层? i.MX95 Neutron SDK 是否需要对称量化(per_channel=True 或 False)才能正确解析输出层? 任何关于 i.MX95 NPU 的指导、参考脚本或 YOLO 部署说明都将不胜感激。        
查看全文
MCXW716C 在高温下运行 你好 我使用的是 #mcxw71,根据数据表,其工作温度范围为 -40 °C 至 +125 °C。我对无线电和 CAN PHY 都进行了测试,但无法在大约 85 °C 以上实现稳定运行。微控制器似乎进入保护模式,或以其他方式限制其功能。 我还注意到,在 SDK 应用程序接口中有向 NBU 发送内部温度的函数。 我的问题是:NBU 是否需要温度信息来进行热调节或维持系统正常运行? 一般来说,是否需要任何特定的程序(配置、校准、所需的 API 调用等)来确保 MCXW716C 在最高额定温度下正常运行? 提前感谢您的帮助。 开发板 Re: MCXW716C operation at high temperature 你好,希望你一切都好。 您使用的是 FRDM 板还是自定义板?您进行了哪些测试,观察到的行为是什么? 能否请您分享一下您所指的是哪些 SDK API?您是否正在研究一个具体的示例或应用? 致以最诚挚的问候, Ana Sofia。 Re: MCXW716C operation at high temperature 你好,@sofiaurueta、 我正在使用参考编号为 #MCXW716CMFTAT 的自定义板。我将解释我的测试和配置 我使用 MCXW716CMFTAT 为无线应用设计了 PCB。我已创建了软件,并使用名为"connectivity_test" 的示例程序中的逻辑来使用无线电协议。 我使用的是 SDK SDK_2.X_MCXW716CxxxA 版本 25.09.00。 两个董事会正在一起工作。我已经实施了所有模块。测试时,我使用了热风枪,温度为 80 °C。15 秒后,微控制器停止工作;它似乎被阻塞了,GPIO 被锁定,通信总线停止发送数据,30 秒后,温度下降后,微控制器恢复正常运行。 因此,我研究了监测温度的功能,以了解问题所在。我使用了 SDK 中 fwk_platform_sensors 文件中的 PLATFORM_StartTemperatureMonitor() 函数。 我的目标是知道微控制器堵塞的确切温度,而令人惊讶的是,这解决了问题。现在,我可以在 +120 °C 的温度下进行测试,微控制器工作正常。我甚至尝试删除该功能,以确保问题是否与软件有关,结果问题又出现了。 您能给我更多的解释吗?使用该功能读取温度是否会将数据分发到不同的内核并调整某些参数? Re: MCXW716C operation at high temperature 你好 您能否确认使用 FRDM 板时是否也会出现这种行为?在未作任何修改的情况下运行 connectivity_test 示例时是否会出现问题,调用 PLATFORM_StartTemperatureMonitor 函数后问题是否会改变? Ana Sofia。
查看全文
No SCL/SDA Signals when using I2C Send as Master I have set up LPI2C1 as Master but get no outputs when attempting to send. I have pull-up resistors and the signals are connected to 1 slave device only. Please see below. What are some possible reasons for this problem? Initialization: /* set I2C1 interrupt */ IntCtrl_Ip_EnableIrq(LPI2C1_IRQn); IntCtrl_Ip_InstallHandler(LPI2C1_IRQn, LPI2C1_Master_Slave_IRQHandler, NULL_PTR); /* Init lpi2c in master mode */ Lpi2c_Ip_MasterInit(LPI2C_CHANNEL_0, &I2c_Lpi2cMasterChannel0); Send data: boolean I2C_read_fault_status(uint8 *rx_buffer) { TxBuff[0] = 0x78;   if (LPI2C_IP_SUCCESS_STATUS == Lpi2c_Ip_MasterSendData(LPI2C_CHANNEL_0, (uint8 *)&TxBuff[0], 1U, FALSE)) { LM5171_data_ptr = rx_buffer; LM5171_data_len = 1; return TRUE; } Re: No SCL/SDA Signals when using I2C Send as Master We are using the S32K324 part with the S32DS3.5 debugger and a Multilink FX Universal interface. Our RTD version is 4.00 HF02. There is not an option in the LPI2C peripheral to enable debugging (like there is in other peripherals). I did not think to set the option manually! When I set the DBGEN bit, the signals work as expected. Re: No SCL/SDA Signals when using I2C Send as Master What kind of debug mode you are using? specific debugger or on board debugger? Re: No SCL/SDA Signals when using I2C Send as Master Hi@phil_b Could you tell us the part number you're using? Also, the RTD version is ? If you're using S32K3, could you please try to set this bit and have a try again. Re: No SCL/SDA Signals when using I2C Send as Master The signals were missing while I was running in Debug mode. When I removed the debug connector, the signals were there! Is there a way to see the signals while in Debug mode?
查看全文
使用SHA3验证S32K148固件 寻求帮助以获得对嵌入式网络安全方法的更高层次的理解。 现在我的想法是,当我们的生产固件准备好时,我们会在应用程序二进制文件上生成一个 SHA3 哈希,并将其存储在安全的内存位置。 然后在应用程序启动时,应用程序将在所有应用程序内存上创建另一个哈希(或者我猜是预定义的启动/停止地址)。 某些东西必须比较两个哈希值(不确定 cSEC 模块是否在硬件中执行此操作?)。如果通过,申请就可以继续进行,如果不通过,申请就会被拒绝。 这种理解看起来正确吗? 我的系统没有引导加载程序。 回复:使用SHA3验证S32K148固件 谢谢卢卡斯。 如果您不想永远处于重置状态,您可以根据不可用的密钥做什么?如果有密钥,如何使用它? 密钥最初是如何存储的?有什么方法可以防止黑客覆盖或重新编程整个设备? S32DS 中有一个名为 csec_boot_protection_S32K148 的项目示例。我正在看它,但有点难以理解它是如何工作的。是否有关于这个具体例子的一些文档,或者只有代码本身?
查看全文