雅特力AT32A403开发板评测 03 官方图形化配置工具Work Bench使用

03 雅特力AT32A403开发板评测 官方图形化配置工具Work Bench使用

1. 软硬件平台

  1. AT32A403A Board开发板

  2. MDK-ARM Keil

  3. Work Bench

    在这里插入图片描述

2. AT32 Work Bench

为了方便开发者快速开发芯片,国外大厂的搞了单片机图形化配置工具,生成初始化配置代码,像使用范围比较多的有,意法半导体的STM32CubeMX,瑞萨电子的e2stuio开发工具FSP。这几年,国产MCU开发厂商也得到了快速发展,但是像图形化配置工具的还是比较少,我自己知道就雅特力的AT32 Work Bench和小华半导体的XHCode,还要一家8位MCU厂商,赛元电子。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

AT32 Work Bench 有以下主要特点:

  1. 支持外设初始化配置
  2. 支持 PIN MUX 配置,并可自定义 PIN 脚标签
  3. 支持系统时钟自动化配置
  4. 支持在线代码预览,所见即所得
  5. 支持 add user code 功能(客户已有代码不会被新生成工程覆盖)
  6. 支持 Keil、IAR、AT32 IDE 等常见 IDE 工程自动生成
  7. 支持最近编辑的设计记录
  8. 支持配置 PDF 报告的生成
  9. 支持中英文切换
  10. 支持 Windows、Linux 等多平台
  11. 支持软件的在线升级,以及 MCU 固件的在线下载

下载地址 https://www.arterytek.com/cn/support/index.jsp?index=0

在这里插入图片描述

支持Windows,Linux系统开发,Windows系统免安装,直接打开使用。
在这里插入图片描述

在这里插入图片描述

3. AT32 Work Bench创建工程测试

  1. 打开AT32 Work Bench软件,选择开发芯片,简单配置芯片类型,创建配置工程。

    以AT32A403芯片作为测试案例,进行下面的全部操作。

    在这里插入图片描述

    在这里插入图片描述

  2. 配置板载LED,配置GPIO端口模式,输出模式 GPIO_Output。

在这里插入图片描述

  1. 串口打印配置,配置USART1 使用PA9,PA10

    选择异步模式,波特率等具体配置如下

    在这里插入图片描述在这里插入图片描述

  2. 生成工程模板

    点击生成代码,设置生成代码路径,设置芯片驱动库版本。

    设置了项目名称,项目位置,使用的工具链(MDK-KEIL),选择了 MCU固件包版本,如果没有则需要自己添加,点击固件包管理,选择对应的芯片,并进行下载。

    在这里插入图片描述在这里插入图片描述

    打开生成的KEIL工程查看生成的代码。

    在这里插入图片描述
    在这里插入图片描述

    GPIO端口配置函数

    在这里插入图片描述

    USART1串口配置函数

    在这里插入图片描述

    时钟使能配置函数

    在这里插入图片描述

  3. 添加个人文件,进行修改完善。

    1. 添加bsp_delay.c bsp_delay.h文件,完善delay_us,delay_ms函数

      /* delay variable */
      static __IO uint32_t fac_us;
      static __IO uint32_t fac_ms;
      /**
        * @brief  initialize delay function
        * @param  none
        * @retval none
        */
      void delay_init()
      {
        /* configure systick */
        systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);
        fac_us = system_core_clock / (1000000U);
        fac_ms = fac_us * (1000U);
      }
      
      /**
        * @brief  inserts a delay time.
        * @param  nus: specifies the delay time length, in microsecond.
        * @retval none
        */
      void delay_us(uint32_t nus)
      {
        uint32_t temp = 0;
        SysTick->LOAD = (uint32_t)(nus * fac_us);
        SysTick->VAL = 0x00;
        SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;
        do
        {
          temp = SysTick->CTRL;
        }while((temp & 0x01) && !(temp & (1 << 16)));
      
        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
        SysTick->VAL = 0x00;
      }
      
      /**
        * @brief  inserts a delay time.
        * @param  nms: specifies the delay time length, in milliseconds.
        * @retval none
        */
      void delay_ms(uint16_t nms)
      {
        uint32_t temp = 0;
        while(nms)
        {
          if(nms > STEP_DELAY_MS)
          {
            SysTick->LOAD = (uint32_t)(STEP_DELAY_MS * fac_ms);
            nms -= STEP_DELAY_MS;
          }
          else
          {
            SysTick->LOAD = (uint32_t)(nms * fac_ms);
            nms = 0;
          }
          SysTick->VAL = 0x00;
          SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
          do
          {
            temp = SysTick->CTRL;
          }while((temp & 0x01) && !(temp & (1 << 16)));
      
          SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
          SysTick->VAL = 0x00;
        }
      }
      
    2. 添加bsp_uart.c bsp_uart.h文件,完善串口打印函数

      这里使用的串口1配置代码是使用工具生成的,我建立了独立的c,h文件,因此需要注释at32a403a_wk_config.c和at32a403a_wk_config.h文件中的wk_usart1_init函数定义和声明.(这样子的目的,仅仅个人习惯而已)

      /* support printf function, usemicrolib is unnecessary */
      #if (__ARMCC_VERSION > 6000000)
        __asm (".global __use_no_semihosting\n\t");
        void _sys_exit(int x)
        {
          x = x;
        }
        /* __use_no_semihosting was requested, but _ttywrch was */
        void _ttywrch(int ch)
        {
          ch = ch;
        }
        FILE __stdout;
      #else
       #ifdef __CC_ARM
        #pragma import(__use_no_semihosting)
        struct __FILE
        {
          int handle;
        };
        FILE __stdout;
        void _sys_exit(int x)
        {
          x = x;
        }
        /* __use_no_semihosting was requested, but _ttywrch was */
        void _ttywrch(int ch)
        {
          ch = ch;
        }
       #endif
      #endif
      
      #if defined (__GNUC__) && !defined (__clang__)
        #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
      #else
        #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
      #endif
      
      /**
        * @brief  retargets the c library printf function to the usart.
        * @param  none
        * @retval none
        */
      PUTCHAR_PROTOTYPE
      {
        while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
        usart_data_transmit(USART1, (uint16_t)ch);
        while(usart_flag_get(USART1, USART_TDC_FLAG) == RESET);
        return ch;
      }
      
      #if (defined (__GNUC__) && !defined (__clang__)) || (defined (__ICCARM__))
      #if defined (__GNUC__) && !defined (__clang__)
      int _write(int fd, char *pbuffer, int size)
      #elif defined ( __ICCARM__ )
      #pragma module_name = "?__write"
      int __write(int fd, char *pbuffer, int size)
      #endif
      {
        for(int i = 0; i < size; i ++)
        {
          while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
          usart_data_transmit(PRINT_UART, (uint16_t)(*pbuffer++));
          while(usart_flag_get(PRINT_UART, USART_TDC_FLAG) == RESET);
        }
      
        return size;
      }
      #endif
      
      
      
      void wk_usart1_init(void)
      {
        /* add user code begin usart1_init 0 */
      
        /* add user code end usart1_init 0 */
      
        gpio_init_type gpio_init_struct;
        gpio_default_para_init(&gpio_init_struct);
      
        /* add user code begin usart1_init 1 */
      
        /* add user code end usart1_init 1 */
      
        /* configure the TX pin */
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
        gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
        gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
        gpio_init_struct.gpio_pins = GPIO_PINS_9;
        gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
        gpio_init(GPIOA, &gpio_init_struct);
      
        /* configure the RX pin */
        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
        gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
        gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
        gpio_init_struct.gpio_pins = GPIO_PINS_10;
        gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
        gpio_init(GPIOA, &gpio_init_struct);
      
        /* configure param */
        usart_init(USART1, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
        usart_transmitter_enable(USART1, TRUE);
        usart_receiver_enable(USART1, TRUE);
        usart_parity_selection_config(USART1, USART_PARITY_NONE);
      
        usart_hardware_flow_control_set(USART1, USART_HARDWARE_FLOW_NONE);
      
        usart_enable(USART1, TRUE);
      
        /* add user code begin usart1_init 2 */
      
        /* add user code end usart1_init 2 */
      }
      
      
    3. 工程模板文件结构

      在这里插入图片描述

4.编写主程序,下载代码,查看现象

  1. 编写主程序代码

    /* add user code begin Header */
    
    /* add user code end Header */
    
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    
    /* private includes ----------------------------------------------------------*/
    /* add user code begin private includes */
    
    /* add user code end private includes */
    
    /* private typedef -----------------------------------------------------------*/
    /* add user code begin private typedef */
    
    /* add user code end private typedef */
    
    /* private define ------------------------------------------------------------*/
    /* add user code begin private define */
    
    /* add user code end private define */
    
    /* private macro -------------------------------------------------------------*/
    /* add user code begin private macro */
    
    /* add user code end private macro */
    
    /* private variables ---------------------------------------------------------*/
    /* add user code begin private variables */
    
    /* add user code end private variables */
    
    /* private function prototypes --------------------------------------------*/
    /* add user code begin function prototypes */
    
    /* add user code end function prototypes */
    
    /* private user code ---------------------------------------------------------*/
    /* add user code begin 0 */
    __IO uint32_t time_cnt = 0;
    /* add user code end 0 */
    
    /**
      * @brief main function.
      * @param  none
      * @retval none
      */
    int main(void)
    {
      /* add user code begin 1 */
      
      /* add user code end 1 */
    
      /* system clock config. */
      wk_system_clock_config();
    
      /* config periph clock. */
      wk_periph_clock_config();
    
      /* nvic config. */
      wk_nvic_config();
    
      /* init usart1 function. */
      wk_usart1_init();
    
      /* init gpio function. */
      wk_gpio_config();
    
      /* add user code begin 2 */
        delay_init();
      printf("Hardware_Init [ok] \r\n");
      printf("at_start_a403a board testing By End\r\n");
      printf("at_start_a403a board testing 2024-02-07\r\n");
      /* add user code end 2 */
    
      while(1)
      {
        /* add user code begin 3 */
        printf("at32_workbench_template start [ok] \r\n");
        printf("at32_led_toggle example start [ok]  \r\n");
    	gpio_bits_reset(GPIOD, GPIO_PINS_13);
        delay_ms(500);
        gpio_bits_set(GPIOD, GPIO_PINS_13);
        delay_ms(500);
        printf("at32_led2_toggle example  [ok]  \r\n");
        gpio_bits_reset(GPIOD, GPIO_PINS_14);
        delay_ms(500);
        gpio_bits_set(GPIOD, GPIO_PINS_14);
        delay_ms(500);
        printf("at32_led3_toggle example  [ok]  \r\n");
        gpio_bits_reset(GPIOD, GPIO_PINS_15);
        delay_ms(500);
        gpio_bits_set(GPIOD, GPIO_PINS_15);
        delay_ms(500);
        printf("at32_led4_toggle example  [ok]  \r\n");
        printf("at32_led_toggle example end [ok]  \r\n");  
        printf("at32_workbench_template end [ok] \r\n");
        printf("usart printf counter: %u\r\n",time_cnt++);
         
        /* add user code end 3 */
      }
    }
    
    
  2. 下载代码

    板载AT-Link下载程序,支持虚拟串口,并对接到PA9,PA10。这里我选择了AT-Link-EZ CMSIS-DAP,之前我直接下载的工程,却显示无非下载,但是下载别人的工程却没有问题,不知道啥子情况,然后设置成这个模式,下载代码就没有问题了,具体原因可能不是这个。

    在这里插入图片描述

  3. 观察现象
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法空间复杂度计算

目录 空间复杂度定义 影响空间复杂度的因素 算法在运行过程中临时占用的存储空间讲解 例子 斐波那契数列递归算法的性能分析 二分法&#xff08;递归实现&#xff09;的性能分析 空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大…

MyBatis3源码深度解析(十一)MyBatis常用工具类(四)ObjectFactoryProxyFactory

文章目录 前言3.6 ObjectFactory3.7 ProxyFactory3.8 小结 前言 本节研究ObjectFactory和ProxyFactory的基本用法&#xff0c;因为它们在MyBatis的源码中比较常见。这里不深究ObjectFactory和ProxyFactory的源码&#xff0c;而是放到后续章节再展开。 3.6 ObjectFactory Obj…

ES6(三):Iterator、Generator、类的用法、类的继承

一、迭代器Iterator 迭代器是访问数据的一个接口&#xff0c;是用于遍历数据结构的一个指针&#xff0c;迭代器就是遍历器 const items[one,two,three];//创建新的迭代器const ititems[Symbol.iterator]();console.log(it.next()); done&#xff1a;返回false表示遍历继续&a…

04_拖动文件渲染在页面中

新建一个文件夹&#xff0c;跟之前一样&#xff0c;在 Vscode 终端里输入 yarn create electron-app Drag。 在 index.html 添加以下代码&#xff0c;JS 文件夹和 render.js 都是新创建的&#xff1a; 首先&#xff0c;css 文件一般和 html 结合使用&#xff0c;相当于 html 是…

Prometheus 监控系统

目录 概述 Prometheus定义 Prometheus 的特点 Prometheus 的生态组件 Prometheus 的工作模式 Prometheus 的工作流程 Prometheus 的局限性 1.部署 Prometheus 上传prometheus包二级制安装 配置系统启动文件&#xff0c;启动 Prometheust 2.部署 Exporters 上传node…

[Spark SQL]Spark SQL读取Kudu,写入Hive

SparkUnit Function&#xff1a;用于获取Spark Session package com.example.unitlimport org.apache.spark.sql.SparkSessionobject SparkUnit {def getLocal(appName: String): SparkSession {SparkSession.builder().appName(appName).master("local[*]").getO…

探索考古文字场景,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建文本考古场景下的甲骨文字符图像检测识别系统

甲骨文是一种非常历史悠久的古老文字&#xff0c;在前面我们基本上很少有涉及这块的内容&#xff0c;最近正好在做文字相关的项目开发研究&#xff0c;就想着基于甲骨文的场景来开发对应的检测识别系统&#xff0c;在前文中我们基于YOLOv5、YOLOv7和YOLOv9开发构建了在仿真数据…

c++:类和对象中:拷贝构造和赋值运算符重载详解

c:类和对象 构造函数和析构函数详解 文章目录 c:类和对象构造函数和析构函数详解 前言一、拷贝构造怎么写拷贝构造1.拷贝构造也是构造函数的一种,构造函数没有值.所以拷贝构造也没有返回值**2.拷贝构造只有一个形参,正常这个形参是自定义类型对象的引用.3. 如果我们没有显示写…

Excel判断CD两列在EF两列的列表中是否存在

需求 需要将CD两列的ID和NAME组合起来&#xff0c;查询EF两列的ID和NAME组合起来的列表中是否存在&#xff1f; 比如&#xff0c;判断第二行的“123456ABC”在EF的第二行到第四行中是否存在&#xff0c;若存在则显示Y&#xff0c;不存在则显示N 实现的计算公式 IF(ISNUMBER…

文字弹性跳动CSS3代码

文字弹性跳动CSS3代码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 下载地址 文字弹性跳动CSS3代码

YOLOv9实例分割教程|(一)训练教程

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、创建数据集及数据配置文件 创新一个文件夹存放分割数据集&#xff0c;包含一个images和labels文件夹。标签格式如下所示&#xff1a; 创新数据集…

Linux——文件系统与软硬链接

目录 前言 一、物理上的磁盘 二、磁盘存储的逻辑抽象结构 三、块组内容与工作原理 1.inode 2.Data bolcks 3.inode 位图 4.bolck bitmap 5.GDT 6.Super Block 四、软硬链接 五、软硬链接链接目录 前言 我们之前学习了文件标识符&#xff0c;重定向&#xff0c;缓…

Spring框架----AOP全集

一&#xff1a;AOP概念的引入 首先我们来看一下登录的原理 如上图所示这是一个基本的登录原理图&#xff0c;但是如果我们想要在这个登录之上添加一些新的功能&#xff0c;比如权限校验 那么我们能想到的就有两种方法&#xff1a; ①&#xff1a;通过对源代码的修改实现 ②&a…

Android实现点击获取验证码60秒后重新获取功能

本文实例为大家分享了Android实现点击获取验证码60秒后重新获取的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 上代码 /*** Created by Xia_焱 on 2017/5/7.*/public class CountDownTimerUtils extends CountDownTimer {private TextView mTextView;/*** param…

Requests教程-17-请求代理设置

上一小节我们学习了requests解决乱码的方法&#xff0c;本小节我们讲解一下requests设置代理的方法。 代理基本原理 代理实际上指的就是代理服务器&#xff0c; 英文叫作proxy server &#xff0c;它的功能是代理网络用户去取得网络信息。形象地说&#xff0c;它是网络信息的中…

Android Studio入门——页面跳转

1.工程目录 2.MainActivity package com.example.demo01;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCo…

前端开发小技巧 - 【Vue3 + TS】 - 在 TS + Vue3 中使用 Pinia,实现 Pinia 的持久化,优化Pinia(仓库统一管理)

前言 ts 中使用 pinia 和 Vue3 基本一致&#xff0c;唯一的不同点在于&#xff0c;需要根据接口文档给 state 标注类型&#xff0c;也要给 actions 标注类型&#xff1b;以下都是 组合式API 的写法&#xff0c;选项式API 的写法大家可以去官网看看&#xff1b; Pinia&#xff…

Text-to-SQL 工具Vanna进阶|数据库对话机器人的多轮对话

跟数据库对话机器人对话,我可不止一个问题。 可能基于第一句问话,还有第二句、第三句问话。。。第N句对话。所以本文测试了多轮对话功能。 单轮对话的环境搭建参考博客 Text-to-SQL 工具Vanna + MySQL本地部署 | 数据库对话机器人 我的数据是这样 1. 基础配置 import vann…

深入解析Java中锁机制以及底层原理

一、概述 1.1 背景 概念&#xff1a;锁是多线程编程中的机制&#xff0c;用于控制对共享资源的访问。可以防止多个线程同时修改或读取共享资源&#xff0c;从而保证线程安全。 作用&#xff1a;锁用于实现线程间的互斥和协调&#xff0c;确保在多线程环境下对共享资源的访问顺…

前端性能优化——javascript

优化处理&#xff1a; 讲javascript脚本文件放到body标记的后面 减少页面当中所包含的script标记的数量 课堂练习&#xff1a; 脚本优化处理 使用原生JavaScript完成操作过程。 document.querySelector document.querySelectorAll classList以及类的操作API Element.class…