1. 新建工程
1) NEW Project
点击“File->New->MounRiver Project”:
2) finish
选择CH573F的裸机开发工程模板,如下图,然后点击“finish”
3) 编译检查
4) 精简代码
打开工程目录下的./src/main.c文件,修改删掉生成的串口测试相关代码,仅保留最简代码,如下图:
2. GPIO输出相关API
1) GPIO引脚配置API
void GPIO{x}_ModeCfg(uint32_t pin, GPIOModeTypeDef mode);
打开目录“.\StdPeriphDriver\”下的“CH573_gipio.c”文件:
在上述文件中可以找到“GPIO{x}_ModeCfg”函数,GPIO{x}_ModeCfg 函数用于完成GPIO{x}端口引脚模式配置,其中:
{x}为端口选择,如A\B\C等;
pin为引脚编号,如GPIO_Pin_0、GPIO_Pin_1等
mode为引脚模式,包括:
2) GPIO输出高低电平API
a) 打开目录“.\StdPeriphDriver\”下的“CH573_gipio.h”文件
b) GPIO{x}_SetBits(pin)/ GPIO{x}_ResetBits(pin)
示例:
GPIOA_SetBits(GPIO_Pin_0);
宏定义封装了GPIO的高低电平控制的API:GPIO{x}_ResetBits(pin);和GPIO{x}_SetBits(pin);
//设置高电平:
GPIOA_SetBits(LED_PIN);
//设置低电平
GPIOA_ResetBits(LED_PIN);
c) GPIO{x}_InverseBits(pin);翻转电平信号输出
GPIOA_InverseBits(LED_PIN);
d) 使用方法
控制GPIO的高低电平的输出,只要初始化端口然后直接控制输出高低电平即可,如:
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA);//推挽输出最大5mA
GPIOA_SetBits(GPIO_Pin_8);//设置高电平
3. 查看LED引脚
打开目录“.\开发板资料\WeActStudio.WCH-BLE-Core\HDK”下的开发板原理图:
可知LED接在PA8引脚上,且低电平点亮。
4. 闪烁LED代码
/********************************** (C) COPYRIGHT ******************************** File Name : Main.c* Author : FUNIOT.XYZ* Version : V1.0* Date : 2020/08/06* Description : 实验01-LED闪烁* Copyright : WeChat official accounts "IOT趣制作"* SPDX-License-Identifier: Apache-2.0*******************************************************************************/#include "CH57x_common.h"/********************************************************************** @fn main** @brief 主函数** @return none*/
int main()
{//时钟初始化SetSysClock(CLK_SOURCE_PLL_60MHz);//LED初始化GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA);//推挽输出最大5mAwhile(1){GPIOA_ResetBits(GPIO_Pin_8); //LED点亮DelayMs(500); //持续0.5sGPIOA_SetBits(GPIO_Pin_8); //LED熄灭DelayMs(500); //持续0.5s//也可以使用下面的翻转达到闪烁的目的
//GPIOA_InverseBits(LED_PIN);//翻转电平信号,使LED状态与原状态相反
//DelayMs(500); //持续0.5s}
}
5. 编译烧录运行
1) 打开下载工具
点击Tools->WCH In-System Programmer:
在自动打开的窗口中的MCU系列选择中选择“32位低功耗蓝牙系列 CH57x-CH58x”:
3) 下载程序文件
a) 查看程序文件位置
进入路径“.\ MounRiver_Studio\workspace\CH573F_00_template\obj”可以看到hex文件:
b) 选择文件
点击目标程序文件的浏览按钮,选中上述的HEX文件路径:
c) 进入下载模式后点击下载
3) 运行
烧录后按下复位,现象:LED交替闪烁
6. 修改为驱动库C和H文件模式
在上文中我们已经实现了LED的基本使用,为了便于以后驱动的管理和移植,我们将LED的驱动配置为C和H文件模式
1) 新建个人驱动文件夹MyDriver
2) 新建led.h
3) 新建led.c
4) 添加驱动库路径
a) 工程右键,单击“Properties”
b) 在打开的窗口中按下图添加驱动库文件夹的路径
5) 补充代码
a) led.h
/** led.h** Created on: Mar 7, 2023* Author: funiot.xyz*/#ifndef MYDRIVER_LED_H_
#define MYDRIVER_LED_H_//头文件包含区/***************************************************/
//宏定义区
#define LED_PIN GPIO_Pin_8
//端口修改请去LED_init()实体区进行调整/***************************************************/
//变量声明区/***************************************************/
//函数声明区
void LED_init(void);
void LED_turnon(void);
void LED_turnoff(void);
void LED_Toggle(void);
/***************************************************/#endif /* MYDRIVER_LED_H_ */
b) led.c
/* led.c* Created on: Mar 7, 2023* Author: funiot.xyz*/
//头文件包含区
#include "led.h"
#include "CH57x_common.h"
/***************************************************/
//宏定义区
/***************************************************/
//变量声明区
/***************************************************/
//函数声明区
/***************************************************/
//函数实体区
/** 函数名:LED_init* 参数:无* 返回值:无* 功能说明:LED初始化*/
void LED_init(void)
{GPIOA_ModeCfg(LED_PIN, GPIO_ModeOut_PP_5mA);//推挽输出最大5mA
}
/** 函数名:LED_turnon* 参数:无* 返回值:无* 功能说明:点亮LED(低电平)*/
void LED_turnon(void)
{GPIOA_ResetBits(LED_PIN);
}
/** 函数名:LED_turnff* 参数:无* 返回值:无* 功能说明:关闭LED(高电平)*/
void LED_turnoff(void)
{GPIOA_SetBits(LED_PIN);
}
/** 函数名:LED_Toggle* 参数:无* 返回值:无* 功能说明:翻转LED电平*/
void LED_Toggle(void)
{GPIOA_InverseBits(LED_PIN);
}/***************************************************/
c) main.c
/********************************** (C) COPYRIGHT ******************************** File Name : Main.c* Author : FUNIOT.XYZ* Version : V1.0* Date : 2020/08/06* Description : 实验01-LED闪烁* Copyright : WeChat official accounts "IOT趣制作"* SPDX-License-Identifier: Apache-2.0*******************************************************************************/
#include "CH57x_common.h"
#include "led.h"
/********************************************************************** @fn main** @brief 主函数* @return none*/
int main()
{SetSysClock(CLK_SOURCE_PLL_60MHz);LED_init();//LED初始化while(1){LED_turnon(); //LED初始化DelayMs(500); //持续500msLED_turnoff();//LED初始化DelayMs(500); //持续500ms//或者直接使用LED_Toggle();
// LED_Toggle();//翻转LED电平
// DelayMs(500); //持续500ms}
}
6) 编译烧录运行
a) 编译
b) 烧录
c) 运行
现象:LED交替闪烁,与未使用驱动库时的现象一致: