打印
[MM32软件]

【Mini-F5265-OB开发板试用测评】RT-Thread的移植(调通串口+LED)学习笔记

[复制链接]
1107|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 丙丁先生 于 2024-12-29 12:51 编辑

根据:
https://aijishu.com/a/1060000000495325
下载:
仓库代码:
https://gitee.com/sakura96888/mm32f5260\_rtt
图片:


用的Putty查看;
Keil用的最新版;


补充:
`#if defined(BSP_USING_UART3) // 如果定义了使用UART3
#ifndef UART3_CONFIG // 如果未定义UART3_CONFIG
#define UART3_CONFIG                                \
    {                                               \
        .name           = "uart3",                  \ // UART3的名称
        .rx_gpiox       = GPIOC,                    \ // 接收引脚的GPIO端口为GPIOC
        .rx_rcc_clock   = RCC_AHBPeriph_GPIOC,       \ // 接收引脚的时钟为RCC_AHBPeriph_GPIOC
        .rx_pin         = GPIO_Pin_11,              \ // 接收引脚为GPIO_Pin_11
        .rx_gpio_af     = GPIO_AF_7,                \ // 接收引脚的复用功能为GPIO_AF_7
        .tx_gpiox       = GPIOB,                    \ // 发送引脚的GPIO端口为GPIOB
        .tx_rcc_clock   = RCC_AHBPeriph_GPIOC,      \ // 发送引脚的时钟为RCC_AHBPeriph_GPIOC (这里可能有误,应为RCC_AHBPeriph_GPIOB)
        .tx_pin         = GPIO_Pin_10,              \ // 发送引脚为GPIO_Pin_10
        .tx_gpio_af     = GPIO_AF_7,                \ // 发送引脚的复用功能为GPIO_AF_7
        .uart_rcc_clock = RCC_APB1Periph_UART3,     \ // UART3的时钟为RCC_APB1Periph_UART3
        .uartx          = UART3,                    \ // UART3的外设为UART3
        .irq_type       = UART3_IRQn,               \ // UART3的中断类型为UART3_IRQn
    }
#endif /* UART3_CONFIG */
#endif /* BSP_USING_UART3 */
`

````c
static int rt_hw_uart_gpio_init(struct mm32_uart_config *cfg)
{
    GPIO_InitTypeDef GPIO_InitStruct; // 定义一个GPIO初始化结构体变量

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART3, ENABLE); // 启用UART3的时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); // 启用GPIOC的时钟

    // 配置GPIOC的Pin10和Pin11引脚为复用功能7(用于UART)
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_7);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_7);

    // 初始化GPIO结构体,设置默认值
    GPIO_StructInit(&GPIO_InitStruct);

    // 配置GPIOC的Pin10引脚
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_10; // 设置引脚为Pin10
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; // 设置引脚速度为高
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP; // 设置引脚模式为复用推挽输出
    GPIO_Init(GPIOC, &GPIO_InitStruct); // 应用配置到GPIOC

    // 再次初始化GPIO结构体,设置默认值
    GPIO_StructInit(&GPIO_InitStruct);

    // 配置GPIOC的Pin11引脚
    GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_11; // 设置引脚为Pin11
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 设置引脚模式为上拉输入
    GPIO_Init(GPIOC, &GPIO_InitStruct); // 应用配置到GPIOC

    return RT_EOK; // 返回成功状态
}
````

````c
static rt_err_t mm32_control(struct rt_serial_device *serial,
                            int                      cmd,
                            void                     *arg)
{
    struct mm32_uart *uart; // 定义一个指向mm32_uart结构体的指针
    rt_ubase_t ctrl_arg = (rt_ubase_t)arg; // 将传入的参数转换为rt_ubase_t类型

    RT_ASSERT(serial != RT_NULL); // 断言检查,确保serial不为空

    uart = rt_container_of(serial, struct mm32_uart, serial); // 获取包含serial的mm32_uart结构体

    switch (cmd) // 根据cmd的值执行不同的操作
    {
        case RT_DEVICE_CTRL_SET_INT: // 如果cmd是设置中断
        {
            UART_ITConfig(uart->config->uartx, UART_IT_RX, ENABLE); // 启用UART接收中断
            NVIC_EnableIRQ(uart->config->irq_type); // 使能对应的中断向量

            break;
        }
        case RT_DEVICE_CTRL_CLR_INT: // 如果cmd是清除中断
        {
            UART_ITConfig(uart->config->uartx, UART_IT_RX, DISABLE); // 禁用UART接收中断
            NVIC_DisableIRQ(uart->config->irq_type); // 禁用对应的中断向量
            break;
        }

    }
    return 0; // 返回成功状态
}

static int mm32_putc(struct rt_serial_device *serial, char c)
{
    struct mm32_uart *uart; // 定义一个指向mm32_uart结构体的指针

    RT_ASSERT(serial != RT_NULL); // 断言检查,确保serial不为空

    uart = rt_container_of(serial, struct mm32_uart, serial); // 获取包含serial的mm32_uart结构体

    UART_SendData(uart->config->uartx, (uint8_t)(c)); // 发送字符数据
    while (RESET == UART_GetFlagStatus(uart->config->uartx, UART_FLAG_TXC)) {}; // 等待发送完成标志置位

    return 1; // 返回成功状态
}

static int mm32_getc(struct rt_serial_device *serial)
{
    struct mm32_uart *uart; // 定义一个指向mm32_uart结构体的指针
    int ch = -1; // 初始化字符变量为-1,表示没有数据

    RT_ASSERT(serial != RT_NULL); // 断言检查,确保serial不为空

    uart = rt_container_of(serial, struct mm32_uart, serial); // 获取包含serial的mm32_uart结构体

    if(UART_GetFlagStatus(uart->config->uartx, UART_FLAG_RXAVL)) // 检查是否有接收到的数据
    {
        ch = UART_ReceiveData(uart->config->uartx); // 读取接收到的数据
        return ch; // 返回读取到的数据
    }

    return -1; // 如果没有数据,返回-1
}

static void uart_isr(struct rt_serial_device *serial)
{
    struct mm32_uart *uart; // 定义一个指向mm32_uart结构体的指针

    RT_ASSERT(serial != RT_NULL); // 断言检查,确保serial不为空

    uart = rt_container_of(serial, struct mm32_uart, serial); // 获取包含serial的mm32_uart结构体

    if(SET == UART_GetFlagStatus(uart->config->uartx, UART_IT_RX)) // 检查是否发生接收中断
    {
        rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); // 调用硬件串口中断处理函数
    }
}

void UART3_IRQHandler(void)
{
    rt_interrupt_enter(); // 进入中断上下文

    uart_isr(&(uart_obj[UART3_INDEX].serial)); // 调用UART中断服务程序

    rt_interrupt_leave(); // 退出中断上下文
}  
````

````c
void SysTick_Init(void)
{
    uint32_t reload = 0; // 定义一个变量用于存储重载值

    SysTick->CTRL &= (uint32_t)0xFFFFFFFB; // 清除SysTick控制寄存器中的第2位,以禁用SysTick定时器

    reload = CLOCK_SYSTICK_FREQ / RT_TICK_PER_SECOND; // 计算重载值,使SysTick定时器每秒产生RT_TICK_PER_SECOND次中断
    reload--; // 减1,因为计数从0开始

    SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; // 设置SysTick控制寄存器中的TICKINT位,使能SysTick中断
    SysTick->LOAD = reload; // 将计算得到的重载值加载到SysTick的LOAD寄存器中
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 设置SysTick控制寄存器中的ENABLE位,启动SysTick定时器
}

void SysTick_Handler(void)
{
    /* enter interrupt */
    rt_interrupt_enter(); // 进入中断处理函数,保存上下文环境

    rt_tick_increase(); // 增加系统时钟节拍数

    /* leave interrupt */
    rt_interrupt_leave(); // 离开中断处理函数,恢复上下文环境
}

void rt_hw_board_init()
{
    SysTick_Init(); // 初始化SysTick定时器
    SystemClock_Config(); // 配置系统时钟

#if defined(RT_USING_HEAP)
    rt_system_heap_init(HEAP_BEGIN, (void *)HEAP_END); // 如果使用堆内存管理,则初始化堆
#endif

#ifdef RT_USING_SERIAL
    extern int rt_hw_uart_init(void); // 声明外部串口初始化函数
    rt_hw_uart_init(); // 初始化串口
#endif

#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
   rt_console_set_device(RT_CONSOLE_DEVICE_NAME); // 设置控制台设备
#endif

#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init(); // 初始化板级组件
#endif
}
````

RT-Thread是一款**由国内团队主导开发的开源实时操作系统**,具有完全的自主知识产权。以下是对RT-Thread的详细介绍:

1. **定义**:RT-Thread是一个嵌入式实时多线程操作系统,它支持多任务运行,但并不意味着处理器在同一时刻真地执行了多个任务。实际上,一个处理器核心在某一时刻只能运行一个任务,但由于每次对一个任务的执行时间很短,任务调度器通过快速的任务切换给人造成多个任务同时运行的错觉。

2. **架构**:RT-Thread采用分层架构设计,自下而上可分为硬件层、内核层、组件与服务层以及RT-Thread软件包层。这种分层架构使得RT-Thread既具有实时操作系统的高效性,又具备丰富的中间件组件和软件包,能够满足物联网时代对嵌入式系统的各种需求。

3. **特性**:RT-Thread具有体积小、成本低、功耗低、启动快速的优势。相较于Linux操作系统,RT-Thread更加适用于资源受限(如成本、功耗限制等)的场合。同时,RT-Thread还具有实时性高、占用资源小等特点,非常适合各种资源受限的物联网设备。

4. **应用领域**:RT-Thread广泛应用于物联网领域,包括但不限于智能家居、智能穿戴设备、工业自动化、医疗设备等。其强大的功能和灵活的架构使得开发者能够快速构建各种类型的嵌入式应用。

综上所述,RT-Thread是一款功能强大、易于使用、高度可扩展的物联网操作系统平台。随着物联网技术的不断发展和普及,相信RT-Thread将在未来发挥更加重要的作用。

要查看RT-Thread操作系统的打印信息,您需要确保以下几点:

1. **硬件连接**:确保您的开发板(如Mini-F5265-OB开发板)已经正确连接到计算机。通常,这涉及使用USB线将开发板与计算机连接起来。

2. **串口通信软件**:您需要一个串口通信软件来查看从开发板发送到计算机的打印信息。常见的串口通信软件包括PuTTY、Tera Term、SecureCRT等。

3. **配置串口参数**:在串口通信软件中,您需要配置正确的串口参数,这些参数应与开发板的串口设置相匹配。常见的串口参数包括波特率(如115200)、数据位(如8位)、停止位(如1位)、校验位(如无校验)等。

以下是具体步骤:

### 使用PuTTY查看打印信息

1. **下载并安装PuTTY**:如果尚未安装PuTTY,可以从[PuTTY官方网站](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)下载并安装。

2. **打开PuTTY**:启动PuTTY应用程序。

3. **选择串口**:在“Session”类别下,选择“Serial”。

4. **配置串口参数**:
   - 在“Serial line”字段中输入对应的COM端口号(例如COM3)。
   - 设置波特率为115200(或其他与开发板匹配的值)。
   - 其他参数保持默认即可。

5. **打开串口**:点击“Open”按钮,PuTTY将尝试连接到指定的串口。

6. **查看打印信息**:一旦连接成功,您应该能够在PuTTY窗口中看到来自开发板的打印信息。

### 使用Tera Term查看打印信息

1. **下载并安装Tera Term**:如果尚未安装Tera Term,可以从[Tera Term官方网站](https://ttssh2.osdn.jp/index.html.en)下载并安装。

2. **打开Tera Term**:启动Tera Term应用程序。

3. **选择串口**:在菜单栏中选择“File” -> “New Connection”,然后选择“Serial...”。

4. **配置串口参数**:
   - 在“Port”字段中选择对应的COM端口号(例如COM3)。
   - 设置波特率为115200(或其他与开发板匹配的值)。
   - 其他参数保持默认即可。

5. **打开串口**:点击“OK”按钮,Tera Term将尝试连接到指定的串口。

6. **查看打印信息**:一旦连接成功,您应该能够在Tera Term窗口中看到来自开发板的打印信息。

### 注意事项

- **确认COM端口号**:确保您选择的COM端口号与实际连接的开发板一致。可以在设备管理器中查看可用的COM端口。
- **权限问题**:在某些操作系统上,可能需要管理员权限才能访问串口。
- **驱动安装**:确保已安装相应的串口驱动程序,特别是对于Windows系统。

通过以上步骤,您应该能够成功查看RT-Thread操作系统的打印信息。如果在操作过程中遇到任何问题,建议查阅相关软件的帮助文档或联系技术支持。

▒+▒K    ▒
\ | /
- RT -     Thread Operating System
/ | \     4.1.1 build Dec 29 2024 11:08:51
2006 - 2022 Copyright by RT-Thread team
msh >list_device
device           type         ref count
-------- -------------------- ----------
uart3    Character Device     2
msh >list_thread
thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
tshell    20  running 0x00000094 0x00001000    11%   0x00000004 OK
tidle0    31  ready   0x00000050 0x00000100    31%   0x0000001b OK
main      10  suspend 0x00000070 0x00000800    09%   0x00000013 OK
msh >help
RT-Thread shell commands:
pin              - pin [option]
help             - RT-Thread shell help.
ps               - List threads in the system.
free             - Show the memory usage in the system.
clear            - clear the terminal screen
version          - show RT-Thread version information
list_thread      - list thread
list_sem         - list semaphore in system
list_event       - list event in system
list_mutex       - list mutex in system
list_mailbox     - list mail box in system
list_msgqueue    - list message queue in system
list_mempool     - list memory pool in system
list_timer       - list timer in system
list_device      - list device in system
list             - list objects

msh >

中文逐行注释

```plaintext
msh >list_device
device           type         ref count
-------- -------------------- ----------
uart3    Character Device     2
```
在RT-Thread操作系统中,列出当前系统中的设备。这里显示了一个名为`uart3`的字符设备,引用计数为2。

```plaintext
msh >list_thread
thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
tshell    20  running 0x00000094 0x00001000    11%   0x00000004 OK
tidle0    31  ready   0x00000050 0x00000100    31%   0x0000001b OK
main      10  suspend 0x00000070 0x00000800    09%   0x00000013 OK
```
列出当前系统中的线程信息。包括线程名称、优先级、状态、堆栈指针、堆栈大小、最大使用量、剩余空间、滴答数和错误状态。

```plaintext
msh >help
RT-Thread shell commands:
pin              - pin [option]
help             - RT-Thread shell help.
ps               - List threads in the system.
free             - Show the memory usage in the system.
clear            - clear the terminal screen
version          - show RT-Thread version information
list_thread      - list thread
list_sem         - list semaphore in system
list_event       - list event in system
list_mutex       - list mutex in system
list_mailbox     - list mail box in system
list_msgqueue    - list message queue in system
list_mempool     - list memory pool in system
list_timer       - list timer in system
list_device      - list device in system
list             - list objects
```
显示RT-Thread shell的帮助信息,列出所有可用的命令及其描述。

```plaintext
msh >
```
命令提示符,等待用户输入新的命令。

其他有意思的msh>命令:
在RT-Thread操作系统的msh(Micro Shell)中,有许多命令可以帮助你管理和调试系统。以下是一些可能对你有帮助的命令:

1. **ps**: 列出系统中的所有线程。
   ```plaintext
   msh > ps
   ```

2. **free**: 显示系统的内存使用情况。
   ```plaintext
   msh > free
   ```

3. **clear**: 清除终端屏幕。
   ```plaintext
   msh > clear
   ```

4. **version**: 显示RT-Thread的版本信息。
   ```plaintext
   msh > version
   ```

5. **list_thread**: 列出当前系统中的线程。
   ```plaintext
   msh > list_thread
   ```

6. **list_sem**: 列出系统中的信号量。
   ```plaintext
   msh > list_sem
   ```

7. **list_event**: 列出系统中的事件。
   ```plaintext
   msh > list_event
   ```

8. **list_mutex**: 列出系统中的互斥锁。
   ```plaintext
   msh > list_mutex
   ```

9. **list_mailbox**: 列出系统中的邮箱。
   ```plaintext
   msh > list_mailbox
   ```

10. **list_msgqueue**: 列出系统中的消息队列。
    ```plaintext
    msh > list_msgqueue
    ```

11. **list_mempool**: 列出系统中的内存池。
    ```plaintext
    msh > list_mempool
    ```

12. **list_timer**: 列出系统中的定时器。
    ```plaintext
    msh > list_timer
    ```

13. **list_device**: 列出系统中的设备。
    ```plaintext
    msh > list_device
    ```

14. **list**: 列出系统中的所有对象(包括线程、信号量、事件、互斥锁、邮箱、消息队列、内存池和定时器)。
    ```plaintext
    msh > list
    ```

这些命令可以帮助你更好地了解和管理你的RT-Thread系统。如果你需要更多详细信息或特定功能,可以参考RT-Thread官方文档或帮助命令 `help`。

这是我学习的过程,感谢分享,感谢观看。





使用特权

评论回复
沙发
丙丁先生|  楼主 | 2024-12-29 12:59 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

671

主题

2398

帖子

5

粉丝