PIC32MX系列单片机外部编程规范解析

需积分: 28 5 下载量 153 浏览量 更新于2024-08-10 收藏 1.14MB PDF 举报
"无线模块433的SendCommand伪操作在PIC32MX微控制器中的应用" 在嵌入式系统设计中,尤其是涉及到微控制器如PIC32MX的编程时,理解如何有效地通信和控制硬件是至关重要的。"SendCommand伪操作"是用于向设备发送特定命令的一种方法,尤其在配置或交互式控制TAP(Test Access Port)寄存器时非常有用。TAP寄存器是边界扫描架构的一部分,常用于芯片的测试和调试。 在6.2章节中描述的SendCommand伪操作流程如下: 1. **TMS头部移入**:首先,通过设置TMS(Test Mode Select)线为特定的序列(1100),进入选择移位IR(Instruction Register)状态,这使得我们可以向设备发送指令。 2. **命令传输**:接着,在TMS保持低电平的同时,通过TDI(Test Data In)线向器件输入命令。这里,命令是以二进制形式逐位移入的,从最低有效位(LSb)到最高有效位(MSb)。 3. **MSb移入**:当命令的最后一个高位(MSb)需要移入时,将TMS设置为高电平,完成命令的传输。 4. **TMS尾部**:最后,再次改变TMS为特定的序列(10),以使TAP控制器恢复到运行/测试空闲状态,从而结束命令发送过程。 举例来说,`SendCommand (5’h07)` 就是发送一个5位的十六进制命令07。在4线和2线的JTAG接口中,这个过程会有细微差别,但基本原理相同。 PIC32MX系列是Microchip Technology公司生产的32位微控制器,它们支持多种编程方式,如自编程和外部工具编程。外部工具编程通常需要一个编程器工具,它能执行必要的编程步骤,并通过2线ICSP或4线JTAG接口与器件通信。 在外部工具编程中,2线ICSP使用In-Circuit Serial Programming协议,而4线JTAG则遵循Joint Test Action Group标准,两者都使用EJTAG协议进行数据交换。编程执行程序(PE)是运行在目标器件RAM上的软件,它可以简化编程流程,提高数据传输效率,并处理与数据传输相关的细节。 在使用这些接口时,开发者需要遵循特定的时序和电气规范,以确保可靠的数据传输和正确的命令执行。例如,配置存储器和器件ID的编程,TAP控制器的操作,以及交流/直流特性与时序要求等,都是编程过程中需要关注的重要方面。 了解并熟练掌握SendCommand伪操作和相关的编程接口对于高效地利用PIC32MX系列微控制器进行系统级设计和调试至关重要。开发者应该参考相关的数据手册和技术文档,以获取更详细的信息和具体的实现指导。

#include "main.h"#include "stdio.h"#include "string.h"UART_HandleTypeDef huart1;GPIO_InitTypeDef GPIO_InitStruct;void LED_Control(uint8_t state) { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, state);}void USART1_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); }}void MX_GPIO_Init(void) { GPIO_InitStruct.Pin = LED_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);}void AT_SendCommand(char *cmd, char *response) { uint8_t buffer_rx[100]; uint8_t buffer_tx[100]; memset(buffer_rx, 0, sizeof(buffer_rx)); memset(buffer_tx, 0, sizeof(buffer_tx)); sprintf((char *)buffer_tx, "%s\r\n", cmd); HAL_UART_Transmit(&huart1, buffer_tx, strlen((char *)buffer_tx), 1000); HAL_UART_Receive(&huart1, buffer_rx, sizeof(buffer_rx), 5000); if (strstr((char *)buffer_rx, response) == NULL) { printf("AT Command Failed: %s", response); }}int main(void) { HAL_Init(); USART1_Init(); MX_GPIO_Init(); char buffer_rx[100]; memset(buffer_rx, 0, sizeof(buffer_rx)); AT_SendCommand("AT", "OK"); AT_SendCommand("AT+CWMODE=1", "OK"); AT_SendCommand("AT+CWJAP=\"ssid\",\"password\"", "OK"); while (1) { AT_SendCommand("AT+CIPSTART=\"TCP\",\"server_ip\",80", "OK"); AT_SendCommand("AT+CIPSEND=4", ">"); AT_SendCommand("test", "SEND OK"); HAL_Delay(1000); }}

2023-06-03 上传

把解析json格式的数据打印到串口com3怎么改写以下代码:#include <SoftwareSerial.h> #include <ArduinoJson.h> SoftwareSerial espSerial(2, 3); // 设置ESP8266的RX和TX引脚 void setup() { Serial.begin(9600); // 与电脑串口通信 espSerial.begin(115200); // 与ESP8266通信 // 初始化ESP8266 sendCommand("AT+RST"); // 重启ESP8266 sendCommand("AT+CWMODE=1"); sendCommand("AT+CWJAP='123','aaalcc16'"); sendCommand("AT+CIPSTART='TCP','api.seniverse.com',80"); sendCommand("AT+CIPMODE=1"); sendCommand("AT+CIPSEND"); sendCommand("GET /v3/weather/now.json?key=S-l4ShgyRNWTaQJ3a&location=guangzhou HTTP/1.1\r\nHost: api.seniverse.com\r\nConnection: close\r\n\r\n"); delay(2000); // 等待ESP8266重启完毕 // 连接WiFi网络 sendCommand("AT+CWJAP=\"123\",\"aaalcc16\""); // 替换为你的WiFi网络的SSID和密码 delay(5000); // 等待ESP8266连接到WiFi网络 } void loop() { // 发送HTTP请求获取天气数据 sendCommand("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80"); delay(2000); // 构建HTTP请求 String getRequest = "GET /v3/weather/now.json?key=S-l4ShgyRNWTaQJ3a&location=guangzhou HTTP/1.1\r\nHost: api.seniverse.com\r\nConnection: close\r\n\r\n"; String cmd = "AT+CIPSEND="; cmd += getRequest.length(); sendCommand(cmd); delay(1000); sendCommand(getRequest); // 解析JSON格式的天气数据 String response = ""; while (espSerial.available()) { char c = espSerial.read(); response += c; } StaticJsonDocument<512> doc; deserializeJson(doc, response); const char* text = doc["results"][0]["now"]["text"]; delay(5000); // 等待服务器响应 // 读取并显示响应数据 while (espSerial.available()) { Serial.write(espSerial.read()); } delay(60000); // 每隔60秒获取一次天气数据 } void sendCommand(String cmd) { espSerial.println(cmd); while (!espSerial.available()); while (espSerial.available()) { Serial.write(espSerial.read()); } }

2023-06-04 上传