主题中讨论的其他部件:MSP-EXP432E401Y
您好,
为了测试闪存操作,我导入了“nvsinternal”作为TIRTOS CCS项目,并将“nvsinternal.c”替换为“flash_access-c”。
/*
* ======== flash_access.c ========
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
/* DriverLib Header files */
#include <ti/devices/msp432e4/driverlib/driverlib.h>
/* Driver Header files */
#include <ti/display/Display.h>
#include <ti/drivers/UART.h>
#include <ti/drivers/NVS.h>
#include <xdc/runtime/System.h>
/* Driver configuration */
#include "ti_drivers_config.h"
typedef struct _rtConfig {
uint32_t programmed; // Deve ter um valor 0x0000ABCD quando programada e nao podemos zerar
uint8_t serverIp4Addr[4]; // Endereco IP do servidor
uint16_t serverPort; // Porta do servidor
uint16_t localServerPort; // Porta local de config
uint32_t equipmentId[8]; // ID do Equipamento
uint8_t serialNumber[16]; // SerialNumber (string)
uint32_t partNumber[4]; // PartNumber
uint32_t reserved[45]; // Reservado Scientts = (256 - Numero de uint32_t acima)
} rtConfig;
#define FOOTER "=================================================="
#define FLASH_STRT_ADDR 0xFC000
/*
* ======== mainThread ========
*/
void *mainThread(void *arg0)
{
uint32_t pui32Data[2], aaa, i, siz;
char buf[64];
rtConfig sv_remoteConf, remoteConf;
uint8_t *ptr;
UART_Params uartParams;
UART_Handle uart;
// Initialize the UART driver and UART parameters
UART_init();
UART_Params_init(&uartParams);
uartParams.writeDataMode = UART_DATA_BINARY; // UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY; // UART_DATA_TEXT;
uartParams.readReturnMode = UART_RETURN_NEWLINE; // UART_RETURN_FULL;
// uartParams.readEcho = UART_ECHO_ON; /*!< Echo received data back */
uartParams.baudRate = 115200;
/* Create a UART for the console */
uart = UART_open(CONFIG_UART_0, &uartParams);
if (uart == NULL) {
while (1);
}
// UART_write(uart, "Hello, Flash Access Test PGM\n", 29);
// Erase a block of the flash.
FlashErase(FLASH_STRT_ADDR);
// Program some data into the newly erased block of the flash.
aaa = sizeof sv_remoteConf;
memset(&sv_remoteConf, 0x00, sizeof sv_remoteConf);
sv_remoteConf.programmed = 0x35353535;
sv_remoteConf.serverIp4Addr[0] = 192;
sv_remoteConf.serverIp4Addr[1] = 168;
sv_remoteConf.serverIp4Addr[2] = 59;
sv_remoteConf.serverIp4Addr[3] = 132;
sv_remoteConf.serverPort = 5555;
sv_remoteConf.localServerPort = 5556;
sv_remoteConf.equipmentId[0] = 70;
sv_remoteConf.equipmentId[1] = 71;
sv_remoteConf.equipmentId[2] = 72;
sv_remoteConf.equipmentId[3] = 73;
sv_remoteConf.equipmentId[4] = 74;
sv_remoteConf.equipmentId[5] = 75;
sv_remoteConf.equipmentId[6] = 76;
sv_remoteConf.equipmentId[7] = 77;
memset(sv_remoteConf.serialNumber, 0x00, sizeof sv_remoteConf.serialNumber);
strcpy((char *)&sv_remoteConf.serialNumber[0], "SN:1234567890");
sv_remoteConf.partNumber[0] = 80;
sv_remoteConf.partNumber[1] = 81;
sv_remoteConf.partNumber[2] = 82;
sv_remoteConf.partNumber[3] = 83;
FlashProgram((uint32_t *)&sv_remoteConf, FLASH_STRT_ADDR, sizeof sv_remoteConf);
SysCtlDelay(100);
// read data from flash designated by FLASH_STRT_ADDR
siz = sizeof sv_remoteConf ;
i = 0;
ptr = (uint8_t *)&remoteConf;
while (i < siz) {
aaa = HWREG(FLASH_STRT_ADDR + i);
memcpy((void *)ptr, (void *)&aaa, 4);
i = i + 4;
ptr = ptr + 4;
}
// output to XDS110 UART
i = remoteConf.programmed;
sprintf((char *)&buf[0], (char *)" programmed = 0x%x\n", i);
aaa = strlen((const char *)&buf[0]);
// UART_write(uart, buf, aaa);
i = remoteConf.serverIp4Addr[0]; // Endereco IP do servidor
i = remoteConf.serverIp4Addr[1]; // Endereco IP do servidor
i = remoteConf.serverIp4Addr[2]; // Endereco IP do servidor
i = remoteConf.serverIp4Addr[3]; // Endereco IP do servidor
sprintf((char *)&buf[0], (char *)" Server IP = %d.%d.%d.%d\n",
remoteConf.serverIp4Addr[0], remoteConf.serverIp4Addr[1],
remoteConf.serverIp4Addr[2], remoteConf.serverIp4Addr[3]);
aaa = strlen((const char *)&buf[0]);
// UART_write(uart, buf, aaa);
i = remoteConf.serverPort; // Porta do servidor
i = remoteConf.localServerPort; // Porta local de configuration
sprintf((char *)&buf[0], (char *)" Server ports = %d and %d\n",
remoteConf.serverPort, remoteConf.localServerPort);
aaa = strlen((const char *)&buf[0]);
// UART_write(uart, buf, aaa);
i = remoteConf.equipmentId[0]; // ID do Equipamento
i = remoteConf.equipmentId[1]; // ID do Equipamento
i = remoteConf.equipmentId[2]; // ID do Equipamento
i = remoteConf.equipmentId[3]; // ID do Equipamento
i = remoteConf.equipmentId[4]; // ID do Equipamento
i = remoteConf.equipmentId[5]; // ID do Equipamento
i = remoteConf.equipmentId[6]; // ID do Equipamento
i = remoteConf.equipmentId[7]; // ID do Equipamento
sprintf((char *)&buf[0], (char *)" Equip IDs = %d %d %d %d %d %d %d %d\n",
remoteConf.equipmentId[0], remoteConf.equipmentId[1],
remoteConf.equipmentId[2], remoteConf.equipmentId[3],
remoteConf.equipmentId[4], remoteConf.equipmentId[5],
remoteConf.equipmentId[6], remoteConf.equipmentId[7]);
aaa = strlen((const char *)&buf[0]);
// UART_write(uart, buf, aaa);
sprintf((char *)&buf[0], (char *)" SerialNumber = %s\n", (char *)&(remoteConf.serialNumber[0]));
aaa = strlen((const char *)&buf[0]);
// UART_write(uart, buf, aaa);
i = remoteConf.partNumber[0]; // PartNumber
i = remoteConf.partNumber[1]; // PartNumber
i = remoteConf.partNumber[2]; // PartNumber
i = remoteConf.partNumber[3]; // PartNumber
sprintf((char *)&buf[0], (char *)" Part NOs = %d %d %d %d\n",
remoteConf.partNumber[0], remoteConf.partNumber[1],
remoteConf.partNumber[2], remoteConf.partNumber[3]);
aaa = strlen((const char *)&buf[0]);
// UART_write(uart, buf, aaa);
SysCtlDelay(500);
UART_close(uart);
return (NULL);
}
此C程序非常简单:
1.打开配置为XDS 110 UART的UART0
2.闪擦除(0xFC000)
3.在名为 SV_remoteConf的C结构中填充数据
4. 使用FlashProgram()函数保存SV_remoteConf结构的此内容
5.访问存储在闪存中的数据并加载到数据结构中
6.使用UART_WRITE将加载的数据输出到COM端口
如果我注释掉所有UART_WRITE语句,则此程序在CCS调试模式下工作正常。
但是,如果我将所有 UART_WRITE语句都激活,则CCS调试将在第一 个UART_WRITE语句中挂起。
我无法继续调试。 所以我停止调试。
在TI-RTOS下,闪存操作和UART操作之间是否有冲突?
请告诉我解决这个问题的线索。
我的测试环境是:
-操作系统:Windows 10 64位
- CCS: 版本:11.2 .0.0.0007万
- simplelink_msp432e4_SDK: 版本4_20_00_12
- MSP-EXP432E401Y LaunchPad
任何帮助/建议都应提前获得。
海升



