【GD32F427开发板试用】+rtt-thread nano+finsh极简开发

news2024/11/17 1:47:12

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:理想三旬

引言

在工作闲暇之际,逛逛论坛,无意间看到GD的试用活动,一如既往的积极,在官方还没发布时就申请了,也如愿的收到了板子,感谢官方和社区给了探索这块板子的机会。

Why rtt

RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。只需内核与Finsh就足够使用,简单方便,个人不喜欢太复杂。

资源

  • GD32F427VKT6
  • 32位Arm®Cortex®-M4处理器内核
  • 高达200 MHz的工作频率
  • 3072K Flash
  • 256k SRAM
  • 4个USART和4个UART,3个I2C,6个SPI,2个I2S,2个CAN2.0B
  • 1个SDIO接口、1个10/100M以太网控制器
  • 3个采样率高达2.6M SPS的12位高速ADC和2个12位DAC,
  • 单循环乘法和硬件除法器
  • 浮点单元(FPU)
  • 集成DSP指令
  • 集成嵌套矢量中断控制器(NVIC)
  • 24位SysTick定时器
    板载:
  • GDlink(可惜只能作为下载,没有串口)
  • 复位按键和用户按键
  • 一个用户LED
  • USB_HS、USB_FS等
    开发前准备
  • 资料下载地址:

https://aijishu.com/a/1060000…

  • 安装芯片包

  • keil安装rtt包

rtt移植

  • 打开LED工程

  • 添加rtt源码

  • board.c处理

  • 屏蔽"gd32f4xx_it.c"中HardFault_Handler、PendSV_Handler、 SysTick_Handler函数
  • 将裸机的延时函数换成操作系统的延时函数

添加Finsh

  • 在添加Finsh前先准备串口
    这里一点需要注意的地方,先上原理图在解释,PA9和PA3已经被占用,使用串口跳过这两个引脚

#include "usart.h"
#include <stdio.h>
#include <rtthread.h>


//int fputc(int ch, FILE *f)

//{

//        /* 将Printf内容发往串口 */

//        usart_data_transmit(USART1, (unsigned char) ch);

        while (!(USART1->SR & USART_FLAG_TXE));

//        while( usart_flag_get(USART1,USART_FLAG_TC)!= SET);        

//        return (ch);

//}

void usart_init(int32_t bound)
{
  rcu_periph_clock_enable( RCU_GPIOD);

  /* enable USART clock */
  rcu_periph_clock_enable(RCU_USART1);

  /* connect port to USARTx_Tx */
  gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_5);

  /* connect port to USARTx_Rx */
  gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_6);

  /* configure USART Tx as alternate function push-pull */
  gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_5);
  gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_5);

  /* configure USART Rx as alternate function push-pull */
  gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_6);
  gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);

  /* USART configure */
  usart_deinit(USART1);
  usart_baudrate_set(USART1,bound);
  usart_receive_config(USART1, USART_RECEIVE_ENABLE);
  usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
  
//    nvic_irq_enable(USART1_IRQn, 2, 0);//设置串口中断的优先级
//    //开启串口接收中断
//    usart_interrupt_enable(USART1, USART_INT_RBNE);
  usart_enable(USART1);
}


//void USART1_IRQHandler(void)
//{
//    uint8_t rx_data = 0;
//    //当接收中断发生
//    if((RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE)) && 
//       (RESET != usart_flag_get(USART1, USART_FLAG_RBNE))){
//        /* Read one byte from the receive data register */
//        rx_data = (uint8_t)usart_data_receive(USART1);//获取接收到的数据
           rt_kprintf("rx_data is %d",rx_data);
//    }
//    
//     //当发送中断发生
//    if((RESET != usart_flag_get(USART1, USART_FLAG_TBE)) && 
//       (RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_TBE))){
//        /* Write one byte to the transmit data register */
//    }
//}
  • 添加Finsh源码

  • 在rtconfig.h中打开finsh_config.h

  • board.c中初始化串口
/*
 * Copyright (c) 2006-2019, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-05-24                  the first version
 */

#include <rthw.h>
#include <rtthread.h>
#include "systick.h"
#include "gd32f4xx.h"
#include "usart.h"

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
 * Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
 * the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
 */
#define RT_HEAP_SIZE (20*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];

RT_WEAK void *rt_heap_begin_get(void)
{
  return rt_heap;
}

RT_WEAK void *rt_heap_end_get(void)
{
  return rt_heap + RT_HEAP_SIZE;
}
#endif

void rt_os_tick_callback(void)
{
  rt_interrupt_enter();
  
  rt_tick_increase();

  rt_interrupt_leave();
}


/* cortex-m 架构使用 SysTick_Handler() */
void SysTick_Handler()
{
  rt_os_tick_callback();

}

/**
 * This function will initial your board.
 */
void rt_hw_board_init(void)
{
//#error "TODO 1: OS Tick Configuration."
  /* 
   * TODO 1: OS Tick Configuration
   * Enable the hardware timer and call the rt_os_tick_callback function
   * periodically with the frequency RT_TICK_PER_SECOND. 
   */

   systick_config();
   SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
   usart_init(115200);

  /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
  rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

#ifdef RT_USING_CONSOLE

//static int uart_init(void)
//{
//#error "TODO 2: Enable the hardware uart and config baudrate."
//    return 0;
//}
//INIT_BOARD_EXPORT(uart_init);

void uart_send_byte(rt_uint8_t data)
{
   while( usart_flag_get(USART1,USART_FLAG_TC)!= SET);   
    usart_data_transmit(USART1, (unsigned char) data);
  
}

void rt_hw_console_output(const char *str)
{
//#error "TODO 3: Output the string 'str' through the uart."
  
  rt_size_t i = 0, size = 0;
  char a = '\r';

//    __HAL_UNLOCK(&UartHandle);

  size = rt_strlen(str);
  for (i = 0; i < size; i++)
  {
      if (*(str + i) == '\n')
      {
         uart_send_byte(a);
      }
       uart_send_byte( *(str + i) );
  }
}

#endif

  • 在finsh_port.c中添加接收代码
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 */

#include <rthw.h>
#include <rtconfig.h>
#include "usart.h"


#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 
#endif

#ifdef RT_USING_FINSH

RT_WEAK char rt_hw_console_getchar(void)
{
  /* Note: the initial value of ch must < 0 */
  int ch = -1;

//#error "TODO 4: Read a char from the uart and assign it to 'ch'."
  
  if( usart_flag_get(USART1,USART_FLAG_RBNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  {
      ch = (uint8_t)usart_data_receive(USART1) & 0xff;
//        rt_kprintf("ch is %d",ch);
  }
  else 
  {
      if( usart_flag_get(USART1, USART_FLAG_ORERR) != RESET)  //
      {
           usart_flag_clear(USART1, USART_FLAG_RBNE);
      }
      rt_thread_mdelay(10);
  }

  return ch;
}

#endif /* RT_USING_FINSH */

运行结果

  • 下载程序,打开终端

  • 输入一个命令list_thread

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 驱动的内核适配 - 方法

原生与野生 Linux 的驱动代码大致可分为两种&#xff1a;一种是已经进入 mainline 的&#xff0c;当内核 API 变化时&#xff0c;会被同步地修改&#xff1b;还有一种是 out-of-tree 的&#xff0c;需要用一套驱动代码去适配不同版本的内核。由于内核 API 持续变动的特性&…

带你实现react源码的核心功能

React 的几种组件以及首次渲染实现React 更新机制的实现以及 React diff 算法 React 的代码还是非常复杂的&#xff0c;虽然这里是一个简化版本。但是还是需要有不错的面向对象思维的。React 的核心主要有一下几点。 虚拟 dom 对象&#xff08;Virtual DOM&#xff09;虚拟 d…

RabbitMQ_消息确认机制

消息确认机制分为消息发送确认机制与消息消费确认机制 消息发送确认机制 消息发送确认机制&#xff1a;消息由producer发送后&#xff0c;确认其是否到达broker&#xff0c;又是否被exchange转发至对应queue的机制 该机制分为两部分&#xff1a;producer---broker&#xff0c…

Android 性能优化之内存优化——重识内存

我们知道&#xff0c;手机的内存是有限的&#xff0c;如果应用内存占用过大&#xff0c;轻则引起卡顿&#xff0c;重则导致应用崩溃或被系统强制杀掉&#xff0c;更严重的情况下会影响应用的留存率。因此&#xff0c;内存优化是性能优化中非常重要的一部分。但是&#xff0c;很…

66-86-javajvm-堆

66-javajvm-堆&#xff1a; 堆的核心概述 堆与进程、线程 一个进程对应一个JVM实例一个JVM实例对应一个堆空间进程包含多个线程&#xff0c;所以线程之间共享同一个堆空间 对堆的认识 一个JVM实例只存在一个堆内存&#xff0c;堆也是Java内存管理的核心区域。Java堆区在JVM启动…

HashMap原理

在Java编程语言中&#xff0c;最基本的结构就是两种&#xff0c;一种是数组&#xff0c;一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造&#xff0c;HashMap也一样。当程序试图将多个 key-value 放入 HashMap 中时&#xff0c;以如下代码片段为例&#xff1a;…

P1182 数列分段 Section II——二分答案

数列分段 Section II 题目描述 对于给定的一个长度为N的正整数数列 A1∼NA_{1\sim N}A1∼N​&#xff0c;现要将其分成 MMM&#xff08;M≤NM\leq NM≤N&#xff09;段&#xff0c;并要求每段连续&#xff0c;且每段和的最大值最小。 关于最大值最小&#xff1a; 例如一数列…

NCTF web总结与复现

前言 打完NCTF休息了一下&#xff0c;总体感觉还行&#xff0c;学到了很多。 calc 这一题也卡了我很久&#xff0c;因为复现过DASCTF三月赛&#xff0c;一直在想着有没有可以替代反引号或绕过的方法&#xff0c;搞了好久都没出&#xff0c;在学长的提示下学到了一个方法&…

最新出炉的阿里巴巴面试题及答案汇总(513页)

前言 秋招已经结束了&#xff0c;不知道各位有没有拿到自己心仪的offer&#xff1f;最近有不少粉丝去阿里巴巴面试了&#xff0c;回来之后我整理成了一份手册java面试时常用到的面试题&#xff08;附答案&#xff09;那么今天分享给大家&#xff0c;祝愿大家都能找到满意的工作…

HTML期末作业课程设计期末大作业——我的美丽家乡湛江 海鲜之都HTML+CSS+JavaScript

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

python爬虫实战之逆向分析酷狗音乐

文章目录前言一、请求分析二、逆向思路三、全部代码总结前言 声明&#xff1a;本文章只是用于学习逆向知识&#xff0c;仅供学习&#xff0c;未经作者同意禁止转载 对于爬虫而言&#xff0c;不管是什么类型的都会遵循这几个步骤 获取目标url分析请求数据逆向解密数据伪造请求清…

算法日常训练12.5

首先有个很大的进步&#xff0c;看见困难题我没选择做逃兵跑路&#xff0c;这点起码是进步了&#xff0c;虽然算法能力还是那么拉&#xff0c;但是起码敢不自量力地分析一下。。。还能看题解理解下。 先找题解中最简单地一种超时方法开始理解&#xff0c;使用动态规划&#xff…

线程基础概念

1.线程基础 现代软件系统中&#xff0c;除了进程之外&#xff0c;线程也是一个十分重要的概念。特别是随着CPU频率增长开始出现停滞&#xff0c;而开始向多核方向发展。多线程&#xff0c;作为实现软件并发执行的一个重要的方法&#xff0c;也开始具有越来越重要的地位。 什么…

[本人毕业设计] 别踩白块_计算机科学与技术_前端H5游戏毕设

摘 要 本文详细介绍了网页版躲避白色钢琴块音乐游戏的设计和实现。由于游戏软件安装占据较大的空间与安装时间&#xff0c;而且步骤繁琐&#xff0c;用常规的游戏安装方法不能取得便捷的游戏安装体验。网页游戏是一种基于在网络游戏中被广泛应用&#xff0c;网页游戏更具有便捷…

【Tensorflow深度学习】实现手写字体识别、预测实战(附源码和数据集 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、数据集简介 下面用到的数据集基于IAM数据集的英文手写字体自动识别应用&#xff0c;IAM数据库主要包含手写的英文文本&#xff0c;可用于训练和测试手写文本识别以及执行作者的识别和验证&#xff0c;该数据库在ICDAR1…

对副业的选择无论是自媒体还是 Python接单 ,始终绕不开IT行业。

前言 这个年代&#xff0c;成年人的日子活成了一部苦情戏。十年前&#xff0c;5000块钱工资还能过的自由自在&#xff1b;今天&#xff0c;估计连车贷&#xff0c;房贷&#xff0c;信用卡都不够还。所以一些想要改变现状的朋友&#xff0c;选择了副业这种形式&#xff0c;副业…

【Linux】Shell脚本详解

目录一.概述二.Linux提供的Shell解析器三.Shell入门1.执行一个简单的shell脚本2.脚本常用的执行方法四.变量1.系统预定义变量2.自定义变量3.特殊变量五.运算符六.条件判断1.单条件判断2.多条件判断七.流程控制(重点)1.if判断2.case语句3.for循环4.while循环八.read读取控制台输…

【论文简述】 Point-MVSNet:Point-Based Multi-View Stereo Network(ICCV 2019)

一、论文简述 1. 第一作者&#xff1a;Rui Chen、Songfang Han 2. 发表年份&#xff1a;2019 3. 发表期刊&#xff1a;ICCV 4. 关键词&#xff1a;MVS、深度学习、点云、迭代改进 5. 探索动机&#xff1a;很多传统方法通过多视图光度一致性和正则化优化迭代更新&#xff…

C语言实例|使用C程序优雅地杀掉其它程序进程

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

FPGA 20个例程篇:18.SD卡存放音频WAV播放(中)

第七章 实战项目提升&#xff0c;完善简历 18.SD卡存放音频WAV播放&#xff08;中&#xff09; 如图1所示是WM8731中11个寄存器功能说明概况图&#xff0c;我们需要对照手册&#xff0c;再去深入了解WM8731中的11个寄存器&#xff0c;怎么去配置这些寄存器达到预期的效果&…