Other Parts Discussed in Thread: CC3235SF
器件型号: CC3235SF
这是 CC3235SF 器件。 它在实地工作了一个星期。 然后、与该器件的通信中断。 每次打开器件时、用户 LED 都会闪烁一次。 当我拔下设备并将其重新插入时、我注意到该 LED 未亮起。
稍后、当我通过不可插拔连接设备时、我注意到程序映像已被删除。 它说 0KB。 这是什么原因? 导致这种情况的原因是什么? 为什么程序映像会自动删除?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的 Mehmet:
程序通常不会自行删除。 这可能是:
根据您对 CC3235SF 器件的描述、这种情况似乎是闪存损坏或故障的典型情况。 下面是最可能的解释:
电源相关问题 :
闪光磨损(一周后可能不太可能发生,但值得考虑) :
硬件看门狗复位 :
文件系统损坏 :
MCU 安全启动验证失败 :
为了防止将来发生这种情况、请考虑实施功耗监控、减少对闪存的写入周期、并确保在应用程序中进行正确的错误处理。
1-) 我创建以下块并运行代码。 在 STA/AP 模式转换期间、我将写入闪存、并且我将在每次启动时读取保存的 Wi-Fi 信息。 我不会干扰存储程序的闪存。 您认为程序映像文件此时被删除或损坏了吗?
int FS_WriteFile(const char *文件名、const void *数据、uint32_t 长度)
{
_i32 fileHandle;
_u32 MAXFILESIZE =长度;
_u32 令牌= 0;
INT 状态= 0;
// Dosya oluşturulmamışsa oluştur ó n, varsa üstüne Yaz
fileHandle = sl_FsOpen ((unsigned char *) filename、
SL_FS_CREATE | SL_FS_OVERWRITE | SL_FS_CREATE_MAX_SIZE (MAXFILESIZE)、
令牌);
if (fileHandle < 0){
return fileHandle;// Hata kodunu döndür
}
// Dosyaya veri Yaz
STATUS = sl_FsWrite (fileHandle、0、(_u8 *) data、length);
if (status < 0){
sl_FsClose (fileHandle、0、(unsigned char *)“a",“,1、1);// Yazma hatası varsa abort ile kapat
返回状态;
}
// Dosyayı düzgün şekilde kapat
状态= sl_FsClose (fileHandle、0、0、0);
返回状态;
}
/**
*@简介 Belirtilen dosyadan veri okur ( tüm içeriği buffer'a kopyalar ).
*
*@param[in] filename Okunacak dosya adı(ör :“/wifi_config.txt")“)
*@param[out] buffer Okunan verinin kopyalanacağı buffer
*@param[in] length Okunacak maksimum byte sayısı(缓冲区 boyutu)
*@return 0: Başarılı,<0: Hata kodu (SL_FS* fonksiyonlarından döner )
*/
int FS_ReadFile(const char *文件名、void *缓冲器、uint32_t 长度)
{
_i32 fileHandle;
_u32 令牌= 0;
INT 状态= 0;
// Dosyayı Oku modunda aç
fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_READ、&token);
if (fileHandle < 0){
return fileHandle ;// Hata kodunu döndür(ör : dosya Yok)
}
// Dosyadan Oku
状态= sl_FsRead (fileHandle、0、(_u8 *) 缓冲区,长度);
if (status < 0){
sl_FsClose (fileHandle、0、(unsigned char *)“a",“,1、1);// Okuma hatası varsa abort ile kapat
返回状态;
}
// Dosyayı düzgün şekilde kapat
状态= sl_FsClose (fileHandle、0、0、0);
返回状态;
}
/**
*@简介 Eğer dosya mevcut değilse belirtilen boyutta boş bir dosya oluşturur。
*
*@param[in] filename Kontrol edilecek/ oluşturulacak dosya adı
*@param[in] length Oluşturulacak dosyanın maksimum boyutu
*/
void ensereFileExists (const char *文件名、uint32_t length){
_i32 fileHandle;
_u32 令牌= 0;
// dosya var mı kontrol et
fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_READ、&token);
if (fileHandle < 0){
// dosya yoksa, boş şekilde oluştur
fileHandle = sl_FsOpen ((unsigned char *) filename、
SL_FS_CREATE | SL_FS_OVERWRITE | SL_FS_CREATE_MAX_SIZE (LENGTH)、
令牌);
if (fileHandle >= 0){
sl_FsClose (fileHandle、0、0、0);// Oluşturulan dosyayı hemen kapat
}
}其他{
// dosya varsa kapat
sl_FsClose (fileHandle、0、0、0);
}
}
//----------------------------------------------------------------------------------------------------
//测试 fonksiyonu: dosya yazma/Okuma örneği(调试 amaçlı)
//----------------------------------------------------------------------------------------------------
Char MyData[]=“deneme!“;
char readBuffer[64]={0};
/**
*@简介 Dosya Sistemi ile yazma/Okuma işlemini 测试 Eder. (Yaz→Oku→Logla)
*/
void flashFileTest(){
ensureFileExists(“wifi_config.txt",“,sizeof、sizeof (readBuffer));// Dosya mevcut değilse oluştur
// Yaz
INT writeRes = FS_WriteFile(“wifi_config.txt",“,MyData、MyData、strlen (MyData);
if (writeRes == 0){
Display_printf (display、0、0、“Dosya başarıyla yazıldı。“);
}其他{
Display_printf (display、0、0、“Yazma hatası:%d“、writeRes);
}
// Oku
memset (readBuffer、0、sizeof (readBuffer));
int readRes = FS_ReadFile(“wifi_config.txt",“,readBuffer、readBuffer、sizeof (readBuffer)- 1);
if (readRes == 0){
Display_printf (display、0、0、“Okunan veri:%s“、readBuffer);
}其他{
Display_printf (display、0、0、“Okuma hatası:%d“、readRes);
}
}
/**
*@简短的 Wi-Fi konfigürasyonunu(SSID,密码,安全,用户名)Tek satır halinde dosyaya 皮艇.
*
*@param[in] SSID Wi-Fi SSID
*@param[in] password Wi-Fi password
*@param[in] security Güvenlik tipi(ör :“2" veya“ veya string olarak)
*@param[in] username Kullanıcı adı( isteğe bağlı)için(企业<eps> )
*@return 0: Başarılı,<0: Hata kodu
*/
int saveWifiConfig(常量字符*SSID,常量字符*password,常量字符*security,常量字符*username){
char buffer[256]={0};
snprintf(缓冲区,sizeof(缓冲区)、“%s|%s|%s|%s",“,SSID、SSID、密码、 安全,用户名);// Tüm alanları| ile birleştir
返回 FS_WriteFile(“wifi_config.txt",“,buffer、buffer、strlen (buffer));
}
/**
*@简短的 Dosyadan Wi-Fi konfigürasyonunu okur ve dört ayrı Alana böler .
*
*@param[out] SSID Okunan SSID(缓冲区,最小 64 字节)
*@param[out] password Okunan password(缓冲区,最小 64 字节)
*@param[out] security Okunan security(缓冲区,最小 16 字节)
*@param[out] username Okunan username(缓冲区,最小 32 字节)
*@return 0: Başarılı, hatası 0: Hata (Okuma veya parse )
*/
int loadWifiConfig(char *SSID, char *password, char *security, char *username){
char buffer[256]={0};
if (FS_ReadFile(“wifi_config.txt",“,buffer、buffer、sizeof (buffer)–1)!= 0)
返回–1;
// Dosya satırını| ile parçala ve sırayla alanlara kopyala.
char *ptr = strtok (buffer、“|")“);
if (ptr) strncpy (SSID、ptr、63);否则返回–2;
ptr = strtok (NULL、“|")“);
if (ptr) strncpy (password、ptr、63);否则返回–2;
ptr = strtok (NULL、“|")“);
if (ptr) strncpy (security、ptr、15);否则返回–2;
ptr = strtok (NULL、“|")“);
if (ptr) strncpy (username、ptr、31);else username[0]= 0;// Kullanıcı adı olmayabilir
返回 0;
}
设备每次启动时都会调用此函数。 //在 sl_Start 之后读取 Wi-Fi 配置文件
enereFileExists(“wifi_config.txt",“,256、256);//如果文件不存在、则创建该文件
int configLoadStatus = loadWifiConfig(SSID,密码,安全性,用户名);
saveCounterValue (1);
TASK_SLEEP (1000);
apmodeaktif=0;
deviceReset ();这样,在更改模式后,我保存值并重置系统。
2) MCU 安全启动验证错误:这是什么意思? 在 CCS Studio 中的哪里可以检查该设置?
3-) 文件系统损坏:这可能是什么原因造成的? 在什么情况下?
4-) My Field 器件的 SOP 值为 010。 这可能是删除它们的原因吗?
其他信息:当我重新启用设备时、它们可以正常工作。 但是、即使我在不重新注册的情况下拔下并重新插入设备、它也不起作用、也根本没有响应。
void deviceReset (void)
{
/* 1) Ağ alt sistemini durdur–açık socket/scan vs. olmasın */
sl_Stop (SL_STOP_TIMEOUT);
/* 2) Kısa bir nefes:NWP STOP'un tamamlanması için 20–50 ms */
ClockP_USleep (50000);
/* 3) Tüm kesmeleri kapat–yarış koşullarını kes */
hwi_disable();// veya hwip_disable()
/* 4)(İsteğe bağlı)watchdog'u kapat ya da beklenen reset nedeni olarak ayarla */
/*…*/
UART_print(“[Common] CC32xx MCU 复位\r\n“);
/* 5) 休眠复位–TI'nin önerdiği “temiz reboot“*/
MAP_PRCMHibernateCycleTrigger();
/* Buraya düşmemeli ć*/
while (1){;}
}
我的 devicereset 函数如下所示
我不会一直写入 SPI 闪存、我会在情况发生变化时写入、然后使用 devicereset 进行复位。
我们将写入外部 SPI 闪存。 它与 LaunchPad 中集成的闪存相同。
int FS_WriteFile(const char *文件名、const void *数据、uint32_t 长度)
{
_i32 fileHandle;
_u32 令牌= 0;
INT 状态;
if(!filename ||!data || length ==0){
返回 SL_ERROR_BSD_EINVAL;
}
/* 1)Önce mevcut dosyayı yazma modunda açmayı Dene.
*(örneğin wifi_config.txt daha önce failsailure/create ile açılmış olabilir)。
*/
fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_WRITE、&token);
if (fileHandle < 0){
/* 2) Dosya yoksa veya açılamıyorsa : failsafe olarak oluştur。
*
* Burada MAXFILESIZE olarak “length" kullanıyoruz“ kullanıyoruz ; kritik config dosyaları
* için zaten Sabit/üst 限制 bir uzunlukla çağırman 理想(Örn . 256)。
*/
_u32 MAXFILESIZE =长度;
fileHandle = sl_FsOpen ((unsigned char *) filename、
SL_FS_CREATE |
SL_FS_OVERWRITE |
SL_FS_CREATE_MAX_SIZE (MAXFILESIZE)|
SL_FS_CREATE_FAILSAFE、
令牌);
if (fileHandle < 0){
return (int) fileHandle;// Açma / oluşturma hatası
}
}
/* 3) Dosyaya baştan í a itibaren Yaz */
STATUS = sl_FsWrite (fileHandle、0、(_u8 *) data、length);
if (status < 0){
/* Yazma hatası→abort signature ile kapat, hatayı Geri döndür */
(void) sl_FsClose (fileHandle、0、(unsigned char *)“a",“,1、1);
返回状态;
}
/* 4) Düzgün şekilde kapat (commit)*/
状态= sl_FsClose (fileHandle、0、0、0);
if (status < 0){
返回状态;
}
返回 0;
}
/**
*@简介 Belirtilen dosyadan veri okur ( tüm içeriği buffer'a kopyalar ).
*
*@param[in] filename Okunacak dosya adı(ör :“/wifi_config.txt")“)
*@param[out] buffer Okunan verinin kopyalanacağı buffer
*@param[in] length Okunacak maksimum byte sayısı(缓冲区 boyutu)
*@return 0: Başarılı,<0: Hata kodu (SL_FS* fonksiyonlarından döner )
*/
int FS_ReadFile(const char *文件名、void *缓冲器、uint32_t 长度)
{
_i32 fileHandle;
_u32 令牌= 0;
INT 状态;
if(!filename ||!buffer || length ==0){
返回 SL_ERROR_BSD_EINVAL;
}
// Dosyayı Oku modunda aç
fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_READ、&token);
if (fileHandle < 0){
return (int)fileHandle;// Hata kodunu döndür(ör:dosya Yok)
}
// Dosyadan Oku
状态= sl_FsRead (fileHandle、0、(_u8 *) 缓冲区,长度);
if (status < 0){
(void) sl_FsClose (fileHandle、0、(unsigned char *)“a",“,1、1);// Okuma hatası varsa abort ile kapat
返回状态;
}
// Dosyayı düzgün şekilde kapat
int closeStatus = sl_FsClose (fileHandle、0、0);
如果 (closeStatus < 0){
返回 closeStatus;
}
返回 0;
}
/**
*@简介 Eğer dosya mevcut değilse belirtilen boyutta boş bir failsafe dosia oluşturur。
*
*@param[in] filename Kontrol edilecek/ oluşturulacak dosya adı
*@param[in] length Oluşturulacak dosyanın maksimum boyutu
*/
void ensereFileExists(const char *文件名、uint32_t 长度)
{
_i32 fileHandle;
_u32 令牌= 0;
if(!fileName || length == 0){
返回;
}
// dosya var mı kontrol et
fileHandle = sl_FsOpen ((unsigned char *) filename、SL_FS_READ、&token);
if (fileHandle >= 0){
// dosya varsa kapatıp çık
(void) sl_FsClose (fileHandle、0、0、0);
返回;
}
// dosya yoksa, failsafe boş dosya olarak oluştur
fileHandle = sl_FsOpen ((unsigned char *) filename、
SL_FS_CREATE |
SL_FS_OVERWRITE |
SL_FS_CREATE_MAX_SIZE (LENGTH)|
SL_FS_CREATE_FAILSAFE、
令牌);
if (fileHandle >= 0){
(void) sl_FsClose (fileHandle、0、0、0);// Oluşturulan dosyayı hemen kapat
}
} 这些代码是否用于 FAT 系统?