ABOV M0系列开发:M0S10系列_M0S10系列调试技巧与工具使用

M0S10系列调试技巧与工具使用

在单片机开发过程中,调试是一个至关重要的环节。ABOV M0S10系列单片机提供了多种调试工具和技巧,可以帮助开发者更高效地解决问题。本节将详细介绍这些调试工具和技巧,包括软硬件调试工具的使用方法、常用的调试技巧以及如何通过日志和断点来定位问题。
在这里插入图片描述

软硬件调试工具

JTAG调试器

JTAG(Joint Test Action Group)调试器是一种常用的硬件调试工具,它通过JTAG接口连接到单片机,提供在线调试功能。ABOV M0S10系列单片机支持JTAG调试,开发者可以使用JTAG调试器进行代码下载、调试和监控。

使用步骤
  1. 连接调试器:将JTAG调试器通过USB接口连接到PC,并通过JTAG接口连接到单片机的JTAG引脚。
  2. 安装驱动:确保调试器的驱动程序已正确安装,通常调试器的厂商会提供相应的驱动安装包。
  3. 配置开发环境:在开发环境中配置JTAG调试器,例如在Keil或IAR等IDE中选择相应的调试器类型。
  4. 启动调试会话:点击调试按钮,启动调试会话,调试器会连接到单片机并加载调试信息。
  5. 设置断点:在代码中设置断点,以便在特定位置暂停执行。
  6. 单步调试:使用单步执行功能逐步检查代码的执行过程。
  7. 查看变量和寄存器:在调试过程中查看变量和寄存器的值,以确定程序的状态。
  8. 修改变量和寄存器:在调试过程中修改变量和寄存器的值,以便进行更复杂的调试操作。
代码示例
// 示例代码:使用JTAG调试器进行单步调试
void main() {
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 延时500ms
        Delay(500);
    }
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

// 延时函数
void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

SWD调试器

SWD(Serial Wire Debug)调试器是一种更现代的调试接口,它通过两根线(SWDIO和SWCLK)与单片机进行通信。ABOV M0S10系列单片机同样支持SWD调试,其使用方法与JTAG调试器类似,但接口更简单,占用的引脚更少。

使用步骤
  1. 连接调试器:将SWD调试器通过USB接口连接到PC,并通过SWD接口连接到单片机的SWD引脚。
  2. 安装驱动:确保调试器的驱动程序已正确安装,通常调试器的厂商会提供相应的驱动安装包。
  3. 配置开发环境:在开发环境中配置SWD调试器,例如在Keil或IAR等IDE中选择相应的调试器类型。
  4. 启动调试会话:点击调试按钮,启动调试会话,调试器会连接到单片机并加载调试信息。
  5. 设置断点:在代码中设置断点,以便在特定位置暂停执行。
  6. 单步调试:使用单步执行功能逐步检查代码的执行过程。
  7. 查看变量和寄存器:在调试过程中查看变量和寄存器的值,以确定程序的状态。
  8. 修改变量和寄存器:在调试过程中修改变量和寄存器的值,以便进行更复杂的调试操作。
代码示例
// 示例代码:使用SWD调试器进行单步调试
void main() {
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 延时500ms
        Delay(500);
    }
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

// 延时函数
void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

常用调试技巧

打印调试信息

在调试过程中,使用打印语句可以输出程序的状态信息,帮助开发者快速定位问题。ABOV M0S10系列单片机通常通过USART接口连接到PC,使用串口助手工具查看输出信息。

代码示例
// 示例代码:使用USART打印调试信息
#include "ABOV_M0S10.h"

#define USART_PORT USART1
#define USART_BAUDRATE 115200

void USART_Init() {
    // 配置USART时钟
    USART_ClockEnable(USART_PORT);
    
    // 配置USART
    USART_Config(USART_PORT, USART_BAUDRATE, USART_WORD_LENGTH_8B, USART_STOP_BITS_1, USART_PARITY_NONE);
    
    // 使能USART
    USART_Enable(USART_PORT);
}

void USART_SendString(const char *str) {
    while (*str) {
        USART_SendData(USART_PORT, *str++);
        while (USART_GetFlagStatus(USART_PORT, USART_FLAG_TXE) == RESET);
    }
}

void main() {
    // 初始化USART
    USART_Init();
    
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED ON\r\n");
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED OFF\r\n");
        
        // 延时500ms
        Delay(500);
    }
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

// 延时函数
void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

使用断点

断点是调试过程中最常用的工具之一,它可以在代码的特定位置暂停执行,以便开发者检查程序的状态。在开发环境中设置断点非常简单,通常只需在代码行号左侧点击即可。

代码示例
// 示例代码:使用断点进行调试
void main() {
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 在这里设置断点,检查LED状态
        // 打印调试信息
        USART_SendString("LED ON\r\n");
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 在这里设置断点,检查LED状态
        // 打印调试信息
        USART_SendString("LED OFF\r\n");
        
        // 延时500ms
        Delay(500);
    }
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

// 延时函数
void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

使用观察窗口

观察窗口可以显示变量和寄存器的实时值,帮助开发者更好地理解程序的执行过程。在Keil或IAR等IDE中,开发者可以通过观察窗口查看和修改变量和寄存器的值。

代码示例
// 示例代码:使用观察窗口进行调试
#include "ABOV_M0S10.h"

#define USART_PORT USART1
#define USART_BAUDRATE 115200

volatile uint32_t counter = 0;

void USART_Init() {
    // 配置USART时钟
    USART_ClockEnable(USART_PORT);
    
    // 配置USART
    USART_Config(USART_PORT, USART_BAUDRATE, USART_WORD_LENGTH_8B, USART_STOP_BITS_1, USART_PARITY_NONE);
    
    // 使能USART
    USART_Enable(USART_PORT);
}

void USART_SendString(const char *str) {
    while (*str) {
        USART_SendData(USART_PORT, *str++);
        while (USART_GetFlagStatus(USART_PORT, USART_FLAG_TXE) == RESET);
    }
}

void main() {
    // 初始化USART
    USART_Init();
    
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED ON\r\n");
        
        // 增加计数器
        counter++;
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED OFF\r\n");
        
        // 延时500ms
        Delay(500);
    }
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

// 延时函数
void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

使用日志文件

日志文件可以记录程序运行过程中的关键信息,帮助开发者在不连接调试器的情况下进行离线调试。ABOV M0S10系列单片机可以通过文件系统或外部存储设备(如SD卡)存储日志文件。

代码示例
// 示例代码:使用日志文件进行调试
#include "ABOV_M0S10.h"
#include "fatfs.h"

#define USART_PORT USART1
#define USART_BAUDRATE 115200
#define LOG_FILE "log.txt"

FIL logFile; // 日志文件句柄

void USART_Init() {
    // 配置USART时钟
    USART_ClockEnable(USART_PORT);
    
    // 配置USART
    USART_Config(USART_PORT, USART_BAUDRATE, USART_WORD_LENGTH_8B, USART_STOP_BITS_1, USART_PARITY_NONE);
    
    // 使能USART
    USART_Enable(USART_PORT);
}

void USART_SendString(const char *str) {
    while (*str) {
        USART_SendData(USART_PORT, *str++);
        while (USART_GetFlagStatus(USART_PORT, USART_FLAG_TXE) == RESET);
    }
}

void Log_Init() {
    // 初始化文件系统
    FATFS fs;
    FRESULT fr = f_mount(&fs, "0:", 1);
    if (fr != FR_OK) {
        USART_SendString("File system mount failed\r\n");
    }
    
    // 打开或创建日志文件
    fr = f_open(&logFile, LOG_FILE, FA_OPEN_APPEND | FA_WRITE);
    if (fr != FR_OK) {
        USART_SendString("Log file open failed\r\n");
    }
}

void Log_Write(const char *str) {
    // 写入日志文件
    FRESULT fr = f_write(&logFile, str, strlen(str), NULL);
    if (fr != FR_OK) {
        USART_SendString("Log file write failed\r\n");
    }
}

void main() {
    // 初始化USART
    USART_Init();
    
    // 初始化日志文件
    Log_Init();
    
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 写入日志文件
        Log_Write("LED ON\r\n");
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 写入日志文件
        Log_Write("LED OFF\r\n");
        
        // 延时500ms
        Delay(500);
    }
    
    // 关闭日志文件
    f_close(&logFile);
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

// 延时函数
void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

实时监控与性能分析

实时监控

实时监控工具可以帮助开发者在程序运行过程中实时查看内存使用情况、CPU使用率等关键信息。ABOV M0S10系列单片机通常通过调试接口(如JTAG或SWD)提供这些监控功能。

使用步骤
  1. 安装监控工具:安装实时监控工具,如Keil的RealView Monitor或IAR的EWARM Monitor。
  2. 配置监控工具:在开发环境中配置监控工具,选择相应的监控类型和参数。
  3. 启动监控:启动实时监控会话,监控工具会连接到单片机并开始监控。
  4. 查看监控信息:在监控工具的界面中查看内存使用情况、CPU使用率等信息。
代码示例
// 示例代码:使用实时监控工具进行监控
#include "ABOV_M0S10.h"

#define USART_PORT USART1
#define USART_BAUDRATE 115200

void USART_Init() {
    // 配置USART时钟
    USART_ClockEnable(USART_PORT);
    
    // 配置USART
    USART_Config(USART_PORT, USART_BAUDRATE, USART_WORD_LENGTH_8B, USART_STOP_BITS_1, USART_PARITY_NONE);
    
    // 使能USART
    USART_Enable(USART_PORT);
}

void USART_SendString(const char *str) {
    while (*str) {
        USART_SendData(USART_PORT, *str++);
        while (USART_GetFlagStatus(USART_PORT, USART_FLAG_TXE) == RESET);
    }
}

void main() {
    // 初始化USART
    USART_Init();
    
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED ON\r\n");
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED OFF\r\n");
        
        // 延时500ms
        Delay(500);
        
        // 实时监控点
        // 例如:使用Keil的__asm("BKPT #0")来插入断点
        __asm("BKPT #0");
    }
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

// 延时函数
void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

性能分析

性能分析工具可以帮助开发者分析程序的执行效率,找出性能瓶颈。ABOV M0S10系列单片机通常通过调试接口(如JTAG或SWD)提供性能分析功能。

使用步骤
  1. 安装性能分析工具:安装性能分析工具,如Keil的μVision Performance Analysis或IAR的EWARM Performance Analysis。
  2. 配置性能分析工具:在开发环境中配置性能分析工具,选择需要分析的函数和参数。
  3. 启动性能分析:启动性能分析会话,性能分析工具会连接到单片机并开始分析。
  4. 查看分析结果:在性能分析工具的界面中查看函数的执行时间、调用次数等信息。
代码示例
// 示例代码:使用性能分析工具进行分析
#include "ABOV_M0S10.h"

#define USART_PORT USART1
#define USART_BAUDRATE 115200

void USART_Init() {
    // 配置USART时钟
    USART_ClockEnable(USART_PORT);
    
    // 配置USART
    USART_Config(USART_PORT, USART_BAUDRATE, USART_WORD_LENGTH_8B, USART_STOP_BITS_1, USART_PARITY_NONE);
    
    // 使能USART
    USART_Enable(USART_PORT);
}

void USART_SendString(const char *str) {
    while (*str) {
        USART_SendData(USART_PORT, *str++);
        while (USART_GetFlagStatus(USART_PORT, USART_FLAG_TXE) == RESET);
    }
}

void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

void Performance_Analysis() {
    // 在这里插入性能分析点
    // 例如:使用Keil的__asm("BKPT #0")来插入断点
    __asm("BKPT #0");
}

void main() {
    // 初始化USART
    USART_Init();
    
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED ON\r\n");
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED OFF\r\n");
        
        // 延时500ms
        Delay(500);
        
        // 性能分析点
        Performance_Analysis();
    }
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

调试技巧总结

1. 逐步调试

逐步调试是通过单步执行代码来逐步检查程序的执行过程,确保每一行代码都按预期工作。这对于查找逻辑错误和调试复杂的代码非常有用。

代码示例
void main() {
    // 初始化USART
    USART_Init();
    
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED ON\r\n");
        
        // 单步调试点
        __asm("BKPT #0");
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED OFF\r\n");
        
        // 单步调试点
        __asm("BKPT #0");
        
        // 延时500ms
        Delay(500);
    }
}

2. 条件断点

条件断点是在特定条件下才会触发的断点。这可以帮助开发者在特定情况下暂停程序执行,减少不必要的调试步骤。

代码示例
void main() {
    // 初始化USART
    USART_Init();
    
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED ON\r\n");
        
        // 条件断点
        if (counter > 1000) {
            __asm("BKPT #0");
        }
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED OFF\r\n");
        
        // 条件断点
        if (counter > 2000) {
            __asm("BKPT #0");
        }
        
        // 延时500ms
        Delay(500);
        
        // 增加计数器
        counter++;
    }
}

3. 日志文件

日志文件可以记录程序运行过程中的关键信息,帮助开发者在不连接调试器的情况下进行离线调试。ABOV M0S10系列单片机可以通过文件系统或外部存储设备(如SD卡)存储日志文件。

使用步骤
  1. 安装文件系统库:安装并配置文件系统库,如FatFS。
  2. 初始化文件系统:在主程序中初始化文件系统。
  3. 打开或创建日志文件:在初始化函数中打开或创建日志文件。
  4. 写入日志文件:在需要记录信息的地方写入日志文件。
  5. 关闭日志文件:在程序结束时关闭日志文件。
代码示例
// 示例代码:使用日志文件进行调试
#include "ABOV_M0S10.h"
#include "fatfs.h"

#define USART_PORT USART1
#define USART_BAUDRATE 115200
#define LOG_FILE "log.txt"

FIL logFile; // 日志文件句柄
volatile uint32_t counter = 0;

void USART_Init() {
    // 配置USART时钟
    USART_ClockEnable(USART_PORT);
    
    // 配置USART
    USART_Config(USART_PORT, USART_BAUDRATE, USART_WORD_LENGTH_8B, USART_STOP_BITS_1, USART_PARITY_NONE);
    
    // 使能USART
    USART_Enable(USART_PORT);
}

void USART_SendString(const char *str) {
    while (*str) {
        USART_SendData(USART_PORT, *str++);
        while (USART_GetFlagStatus(USART_PORT, USART_FLAG_TXE) == RESET);
    }
}

void Log_Init() {
    // 初始化文件系统
    FATFS fs;
    FRESULT fr = f_mount(&fs, "0:", 1);
    if (fr != FR_OK) {
        USART_SendString("File system mount failed\r\n");
    }
    
    // 打开或创建日志文件
    fr = f_open(&logFile, LOG_FILE, FA_OPEN_APPEND | FA_WRITE);
    if (fr != FR_OK) {
        USART_SendString("Log file open failed\r\n");
    }
}

void Log_Write(const char *str) {
    // 写入日志文件
    FRESULT fr = f_write(&logFile, str, strlen(str), NULL);
    if (fr != FR_OK) {
        USART_SendString("Log file write failed\r\n");
    }
}

void main() {
    // 初始化USART
    USART_Init();
    
    // 初始化日志文件
    Log_Init();
    
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 写入日志文件
        Log_Write("LED ON\r\n");
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 写入日志文件
        Log_Write("LED OFF\r\n");
        
        // 延时500ms
        Delay(500);
        
        // 增加计数器
        counter++;
        
        // 条件断点
        if (counter > 1000) {
            __asm("BKPT #0");
        }
    }
    
    // 关闭日志文件
    f_close(&logFile);
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

// 延时函数
void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

4. 观察窗口

观察窗口可以显示变量和寄存器的实时值,帮助开发者更好地理解程序的执行过程。在Keil或IAR等IDE中,开发者可以通过观察窗口查看和修改变量和寄存器的值。

使用步骤
  1. 配置观察窗口:在开发环境中配置观察窗口,选择需要观察的变量和寄存器。
  2. 启动调试会话:启动调试会话,连接到单片机。
  3. 查看观察窗口:在观察窗口中查看变量和寄存器的实时值。
  4. 修改观察窗口中的值:在调试过程中修改变量和寄存器的值,以便进行更复杂的调试操作。
代码示例
// 示例代码:使用观察窗口进行调试
#include "ABOV_M0S10.h"

#define USART_PORT USART1
#define USART_BAUDRATE 115200

volatile uint32_t counter = 0;

void USART_Init() {
    // 配置USART时钟
    USART_ClockEnable(USART_PORT);
    
    // 配置USART
    USART_Config(USART_PORT, USART_BAUDRATE, USART_WORD_LENGTH_8B, USART_STOP_BITS_1, USART_PARITY_NONE);
    
    // 使能USART
    USART_Enable(USART_PORT);
}

void USART_SendString(const char *str) {
    while (*str) {
        USART_SendData(USART_PORT, *str++);
        while (USART_GetFlagStatus(USART_PORT, USART_FLAG_TXE) == RESET);
    }
}

void Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        // 空循环延时
    }
}

void main() {
    // 初始化USART
    USART_Init();
    
    // 初始化GPIO
    GPIO_Init();
    
    // 设置LED引脚为输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT);
    
    // 主循环
    while (1) {
        // 点亮LED
        GPIO_SetPinHigh(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED ON\r\n");
        
        // 增加计数器
        counter++;
        
        // 延时500ms
        Delay(500);
        
        // 熄灭LED
        GPIO_SetPinLow(LED_PIN);
        
        // 打印调试信息
        USART_SendString("LED OFF\r\n");
        
        // 延时500ms
        Delay(500);
    }
}

// GPIO初始化函数
void GPIO_Init() {
    // 配置GPIO时钟
    GPIO_ClockEnable();
    
    // 设置LED引脚为推挽输出
    GPIO_SetPinMode(LED_PIN, GPIO_MODE_OUTPUT_PP);
}

调试工具的选择

在选择调试工具时,开发者需要根据具体的需求和项目特点来决定使用哪种工具。以下是一些选择调试工具的建议:

  • JTAG调试器:适用于复杂的调试场景,需要更多的调试功能和选项。JTAG接口提供更强大的调试能力,但占用的引脚较多。
  • SWD调试器:适用于简单的调试场景,占用的引脚较少,接口更简单。对于大多数项目来说,SWD调试器已经足够使用。
  • 打印调试信息:适用于需要快速输出程序状态信息的场景,特别是当调试器不可用时。通过串口助手工具查看输出信息。
  • 观察窗口:适用于需要实时监控变量和寄存器值的场景,可以直观地看到程序的运行状态。
  • 日志文件:适用于需要记录程序运行过程中的关键信息的场景,特别适用于离线调试和长时间运行的项目。

通过合理使用这些调试工具和技巧,开发者可以更高效地解决单片机开发中的各种问题,提高开发效率和代码质量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值