LED流水灯
本帖最后由 Youzhiyu 于 2022-5-22 09:46 编辑
(1)MRS开发环境的安装 CH32V307是基于RISC-V架构的微处理器,沁恒微 电子WCH提供了MoubRiver Studio开发环境进行开发,MRS是对Eclipse GNU优化而来、以RISC-V内核为主的嵌入式集成开发环境。MRS官网下载地址: http://www.mounriver.com/。在进行程序开发之前需要下载安装MRS开发环境,其安装过程简单,采用默认安装即可,安装完成后即可启动应用程序开发。 (2)WCH-LINK驱动安装 安装MRS开发环境后,会自动安装WCH-LINK的驱动。若安装失败,可以手动打开MounriverStudio安装路径下LinkDrvLink文件夹,手动安装Link文件夹下的SETUP.EXE。 由于本人的笔记本有点老,系统是Win7 x64SP1,安装驱动过程中提示安装失败。如下图所示。
打开设备管理器查看,如下图所示,发现是数字签名问题。
(3)LED灯闪烁项目创建 MSR创建工程应用项目时,MSR会自动导入芯片相关的固件支持库,以降低应用程序的开发难度。启动MRS环境,进入File-New--New> MounRiverProject菜单,启动工程创建页面,如图1所示。
图1 工程创建 随后,单击Finish按钮完成项目设置和芯片选择。MRS自动导入芯片支持固件库文件,并生成工程项目,如图所示。
图2工程文件视图 若对 STM32F10X系列的固件库程序开发较熟悉的朋友,相信一眼就能明白MRS创建的工程项目文件的功能及其作用。从MRS自动创建的文件可以看出,CH32V307307应用程序文件几乎与STM32F10X系列的固件库开发程序文件及文件作用几乎一致,给从STM32转移到CH32V307的开发提供了便利。 (3)应用程序启动流程分析 与STM32F10X系列启动类似,CH32V307上电启动流程配置应该是在启动配置汇编文件startup_ch32v30x_D8C.s确定的。进入startup_ch32v30x_D8C.s文件可以看到:
上图表明上电启动后进入中断向量表 _vector_base执行, _vector_base第一个单元是op tion norvc,是设置向量表。第2个单元是 _start ,而_start处设置的是跳转到handle_reset执行。handle_reset应该是复位中断服务程序。
1) 在handle_reset程序中,先对相关寄存器配置,随后执行“jal SystemInit”语句,即跳转到SysTemInit()函数执行。通过查收可知SysTemInit()函数是对系统时钟进行配置的函数,具体实现在system_ch32v30x.c中。 2) 随后执行“lat0, main”语句,即跳转到main()函数中执行用户功能程序。 从上面分析可以看出,CH32V307利用MRS创建工程时,其应用程序启动后,首先进入复位中断服务程序执行,并在复位中断中调用SysTemInit()函数进行系统时钟初始化,初始化完成后直接进入main()函数。因此针对具体应用时我们可以直接在main()函数中进行代码编写即可,简化了启动底层代码的配置与编写。 注意:(1)默认SysTemInit()函数采用外部8MHz晶振作为系统时钟源,并进内部PLL倍频到72MHz作为系统时钟。若要使用其他时钟源及系统时钟,可以手动修改SysTemInit()函数进行配置。 (2) 在handle_reset应该是复位中断服务程序开始之前,将handle_reset声明为“.weak”属性,如下图所示,表明handle_reset可以重载。若在其他文件中重新定义名称同为handle_reset的函数,在程序链接时将链接自己编写的handle_reset函数,而忽略汇编语言中的handle_reset,为我们重写复位中断服务程序提供了便利。
综上,CH32V307应用程序上电启动流程为:
(4)User项目下文件说明 在利用MRS创建工程时,在User子项目下自动生成了6个文件,其作用如下: Ø ch32v30x_conf.h : 芯片片上资源配置,默认是启用了所有片上资源的包含文件。默认情况下编译时将会编译所有资源文件,编译速度较慢。具体应用开发时,可以根据需要启用需要的文件,而不用资源文件可以不包含,这个将提高编译速度。 Ø ch32v30x_it.h/ch32v30x_it.c : 中断服务程序的什么与实现文件。若项目中涉及到中断服务程序的编写,可以放到此文件中进行声明与实现。 Ø system_ch32v30x.h/system_ch32v30x.c: 系统时钟配置文件,其中的SysTemInit()函数就是在启动汇编程序Handle_reset中被调用的,用于配置芯片的系统时钟,用户可以更加实际情况进行修改。 Ø main.c : MRS生成的主函数文件,用于应用功能程序编写。并在该文件中包含了#include "debug.h"头文件和int main(void)函数的实现框架,应用程序可直接在main()函数中进行编写。 注意: debug.h 文件中包含了stdio.h和ch32v30x.h两个资源头文件。stdio.h主要用于实现printf打印输出到串口功能,ch32v30x.h是与芯片寄存器定义相关的头文件。若应用程序中不希望使用debug.h提供的调试功能及延时函数,可以将main.c文件开始处的包含语句改为“ #include "ch32v30x.h" ” 语句。即只包含芯片寄存器定义文件即可。类似51 单片机开发时,首先要包含reg51.h文件一样。 (5)LED流水灯硬件连接说明 CH3V307评估板板载LED1和LED2,分别与J3排针的J3-19和J3-21连接的,另外以太网接口上有两个LED灯也可以当作普通LED灯使用,他们分别连接到J3排针的J3-11和J3-13上。在进行LED控制程序编写前,需要先用杜邦线将LED灯连接MCU对应的GPIO管脚上。本介绍将4个LED等分别通过杜邦线连接到GPIOA端口的PA0、PA1、PA2、PA3上。连接示意图如下图所示。
(6)编写LED端口的初始化功能函数 在main.c文件中,利用MRS提供的固件库ch32v30x_rcc.h/ch32v30x_rcc.c、ch32v30x_gpio.h/ch32v30x_gpio.c编写一个LED_Init()函数,具体代码如下: (7)编写LED流水灯应用程序 在main()函数中调用LED_Init()函数进行初始化,并在while循环体中实现流水灯控制。由于此处使用不到中断,因此屏蔽掉中断优先级设置语句,此处也不使用串口调试功能,也可以屏蔽掉,具体代码如下:
编译,下载程序到CH32V307307评估板,可以看到ELED1、ELED2、LED1、LED2依次点亮,形成间隔为500ms的流水灯。 通过第一个应用程序LED流水灯的编写过程看,CH32V307提供的固件库函数接口及其使用方法与STM32F10x固件库函数接口及其使用方法几乎相同,为从STM32F1XX系列迁移到CH32V307应用开发提供了便利,并且开发过程毫无障碍。
|