三、LED闪烁

        通过LED的闪烁实验,详解Keil MDK中创建mm32单片机的工程的步骤。

1、开发环境

(1)Keil MDK: V5.38.0.0

(2)MCU: mm320163D7P。

2、Keil工程的创建

(1)打开Keil MDK。

(2)点击“Project”→“New μVision Project...”。

(3)选择工程保存地址及工程文件名,然后点击确定。

(4)选择相应的单片机型号,然后点击“OK”即可。

(5)弹出“管理运行时环境”对话框,保持默认,点击OK即可。

3、移植库文件

3.1、下载库函数和例程。

(1)进入官网:上海灵动微电子股份有限公司

(2)点击“产品”,先择对应的单片机型号。

(3)点击“工具和软件”,下载库函数和例程。

3.2、移植库文件到对应文件夹

(1)解压下载的库函数和例程。

(2)复制Device文件。

(3)粘贴到LED闪烁工程对应的文件夹。

3.3、文件添加到Keil工程中的准备工作

(1)打开Keil。

(2)点击“Manage Project Items”,进行如下配置。

(3)与MDK-ARM同级目录下新建APP文件夹,存放自己创建的源代码。在这里先创建main.c和main.h文件夹。

  • 可以创建多个文件夹,进行代码的分层,如应用层、驱动层。
  • APP文件夹下可以创建src文件和inc文件,分别存放源文件和头文件。
  • 要明确知道自己创建的存放头文件的路径,在Keil中要包含这些路径。

(4)移植的Device文件中,有些是与开发环境有关的文件,我们使用的是Keil MDK,其他多余的可删除。

  • 删除 Device\MM32F0160\Source\IAR_StartAsm 文件。
  • 删除 Device\CMSIS\IAR_CORE 文件。

3.4、文件添加到Keil中

参照官网例程添加:

(1)STARTUP中添加文件及路径如下。

  • system_mm32f0160.c;LedBlink_Code\Device\MM32F0160\Source\...
  • startup_mm32f0160_keil.s;LedBlink_Code\Device\MM32F0160\Source\KEIL_StartAsm\...

(2)HAL_LIB中添加文件及路径如下。

  • hal_xx.c;LedBlink_Code\Device\MM32F0160\HAL_lib\src\所有文件

(3)APP目录下添加main.c文件,doc目录下可存放readme文件。

(4)Keil中添加对应的头文件路径。

  • LedBlink_Code\Device\MM32F0160\HAL_lib\inc
  • LedBlink_Code\Device\CMSIS\KEIL_CORE
  • LedBlink_Code\Device\MM32F0160\Include
  • LedBlink_Code\APP\inc

3.5、编译检查

(1)检查添加的文件类型是否错误。(在当前环境下就会出现这个问题)

(2)如下页面配置检查

  • 宏定义 USE_STDPERIPH_DRIVER(暂时非必须,,没有也不报错)
  • 勾选C99 Mode,不勾选GNU extensions

(3)main.c中包含 "hal_conf.h" 头文件。

4、代码编写

(1)drv_systick.c文件。

#include "drv_systick.h"

// SysTick延时相关变量
volatile uint32_t SysTickDelayTick;



/*
**功能:为延时功能初始化SysTick定时器
**参数:无
**返回值:无
 */
void SysTick_InitDelay(void)
{
	RCC_ClocksTypeDef RCC_Clocks;       // 定义RCC时钟结构体变量
	RCC_GetClocksFreq(&RCC_Clocks);     // 引用调用获取各时钟频率
	
	// System Tick配置为xx
	if (SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000))
    {
		// 进入这则说明配置失败
        while (1)
        {
        }
    }
	// 设置SysTick中断号和中断优先级
	NVIC_SetPriority(SysTick_IRQn, 0x0);
}

/*
**功能:毫秒延时
**参数:	Millisecond:延时多少个毫秒
**返回值:无
 */
void SysTick_DelayMS(uint32_t Millisecond)
{
    SysTickDelayTick = Millisecond;

    while (0 != SysTickDelayTick)
    {
		
    }
}


/****************************************************************************************
  * @brief  This function handles SysTick Handler
  * @note   none
  * @param  none
  * @retval none
  ****************************************************************************************/
void SysTick_Handler(void)
{
    if (0 != SysTickDelayTick)
    {
        SysTickDelayTick--;
    }
}

(2)drv_systick.h文件。

#ifndef __DRV_SYSTICK_H__
#define __DRV_SYSTICK_H__

#include "hal_conf.h"

void SysTick_InitDelay(void);
void SysTick_DelayMS(uint32_t Millisecond);

#endif

(3)drv_led.c文件

#include "hal_conf.h"
#include "drv_led.h"

/*
**功能:LED引脚初始化
**参数:无
**返回值:无
**注:
**	LED1 红灯 PC9
**	LED2 绿灯 PC8
**	LED3 蓝灯 PC7
**	LED4 黄灯 PC6
 */
void LedPin_Init(void)
{
	// GPIO初始化结构体定义
	GPIO_InitTypeDef GPIO_InitStruct;
	// 使能GPIOC端口时钟
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOC, ENABLE);
	// 重置GPIO_InitStruct结构体参数值
    GPIO_StructInit(&GPIO_InitStruct);
	
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_7 | GPIO_Pin_6;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStruct);
	
	GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); // LED1点熄灭
	GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET); // LED2点熄灭
	GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET); // LED3点熄灭
	GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET); // LED4点熄灭
}



(4)drv_led.h文件

#ifndef __DRV_LED_H__
#define __DRV_LED_H__

/*函数声明*/
void LedPin_Init(void);     //LED引脚初始化



#endif

(5)main.c文件

#include "hal_conf.h"

#include "main.h"
#include "drv_led.h"
#include "drv_systick.h"


int main(void)
{
	SysTick_InitDelay();
	LedPin_Init();

    while (1)
    {
		GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); // LED1熄灭
		GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET); // LED2熄灭
		GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET); // LED3熄灭
		GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET); // LED4熄灭
		SysTick_DelayMS(500);
		
		GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_RESET); // LED1点亮
		GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET); // LED2点亮
		GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET); // LED3点亮
		GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_RESET); // LED4点亮
		SysTick_DelayMS(500);
			
    }
	//return 0;
}

5、烧录验证

6、完整工程下载地址

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

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

相关文章

RE2文本匹配实战

引言 今天我们来实现RE2进行文本匹配,模型实现参考了官方代码https://github.com/alibaba-edu/simple-effective-text-matching-pytorch。 模型实现 RE2模型架构如上图所示。它的输入是两个文本片段,所有组件参数除了预测层和对齐层外都是共享的。上图…

变周期控制思路

举例&#xff1a;热值调节的过程中&#xff0c;调节周期在偏差较小时&#xff0c;可以设置较大些&#xff0c;调节周期在偏差较大时&#xff0c;可以设置较小些。并且在偏差较大时&#xff0c;立刻进入调节&#xff08;计时器清零&#xff09;。 -350<偏差<600&#xff0…

华为麒麟服务器--硬盘问题

记录以下今天处理的服务器&#xff1a; 情况说明&#xff1a;linux 系统&#xff0c;不知道什么原因系统就突然不能用了&#xff08;据说是前段时间断电来着&#xff0c;但是机房有应急电源&#xff09;。 系统环境&#xff1a; 服务器&#xff1a;华为RH2288H V3 服务器 服…

设计模式(二)-创建者模式(2-0)-简单工厂模式

一、简单工厂模式定义 客户端不需要关注创建实例的过程。于是需要通过工厂模式&#xff0c;要把创建对象过程和使用对象进行分离。所以客户端只要使用对象即可&#xff0c;而创建对象过程由一种类来负责&#xff0c;该类称为工厂类。 由于创建实例的方式是在静态方法里实现的…

文件钓鱼-后缀隐藏文件捆绑文件压缩释放技巧

0x00 文件钓鱼 简单说下文件样本钓鱼的目的&#xff0c;为诱导用户安装木马文件&#xff0c;达到控制或者窃取某些信息的目的&#xff0c;抛开邮件的真实性。木马的伪造是一个比较关键的点&#xff0c;下面简要说下三种木马文件伪装的技巧 0x01 水坑攻击与鱼叉攻击的概念 水坑…

VMware——WindowServer2012R2环境mysql5.7.14解压版安装主从复制(图解版)

目录 一、服务器信息二、192.168.132.33主服务器上安装mysql&#xff08;主&#xff09;2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 …

AD教程 (十九)PCB板框的评估和层叠设置

AD教程 &#xff08;十九&#xff09;PCB板框的评估和层叠设置 板子越小&#xff0c;层数越少&#xff0c;成本越低 PCB板框评估 器件摆放 CtrlA 选中全部器件点击工具&#xff0c;选择器件摆放&#xff0c;选择在矩形区域排列 框定矩形区域&#xff0c;器件就会摆放在框定的矩…

Unity Meta Quest 一体机开发(七):配置玩家 Hand Grab 功能

文章目录 &#x1f4d5;教程说明&#x1f4d5;玩家物体配置 Hand Grab Interactor⭐添加 Hand Grab Interactor 物体⭐激活 Hand Grab Visual 和 Hand Grab Glow⭐更新 Best Hover Interactor Group &#x1f4d5;配置可抓取物体&#xff08;无抓取手势&#xff09;⭐刚体和碰撞…

sftp 从windows10向linux(centos7)传输文件

前言背景&#xff1a;该示例是需要从windows10向本地linux系统传输一个qt安装文件&#xff0c;不想或者无法安装xftp这些传输工具&#xff0c;直接通过命令传输&#xff1b; 首先保证windows10 ping通linux系统ip&#xff0c;linux ping 通windows10系统&#xff1b; 注意&am…

ps找不到msvcp140.dll怎么办?亲测5个有效的修复方法分享

运行Photoshop时提示找不到MSVCP140.dll&#xff0c;这是因为计算机MSVCP140.dll文件丢失或者损坏。msvcp140.dll是微软Visual C 2015运行库的一部分&#xff0c;它包含了许多用于支持C运行的函数和类。当我们在使用某些程序时&#xff0c;如果这个程序依赖于msvcp140.dll&…

Figma 插件学习(一)

一.插件介绍 插件在文件中运行&#xff0c;执行一个或多个用户操作&#xff0c;并允许用户自定义其体验或创建更高效的工作流程。 插件通过专用插件API与Figma的编辑器交互。还可以利用外部Web API。 1.插件API 插件API支持读写功能&#xff0c;允许查看、创建和修改文件的…

单片机实验(二)

前言 实验一&#xff1a;用AT89C51单片机控制LCD 1602&#xff0c;使其显示两行文字&#xff0c;分别显示自己的学号和姓名拼音。 实验二&#xff1a;设计一个中断嵌套程序。要求K1和K2都未按下时&#xff0c;单片机控制8只数码管&#xff0c;滚动输出完整的学号。当按一下K1…

《微信小程序开发从入门到实战》学习二十

3.3 开发创建投票页面 3.3.8 使用icon图标文件 原来已经实现了投票选项的增加和修改功能&#xff0c;现在还差删除。现在为每一个选项增加删除按钮&#xff0c;可以以通过icon图标组件实现。 icon常用属性如下&#xff1a; type icon的类型&#xff0c;有success、s…

数据结构【DS】树与二叉树的应用

哈夫曼树 树的带权路径长度最小的二叉树WPL 路径长度【边数】 * 结点权值n个叶结点的哈夫曼树共有 2n-1 个结点 哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树对同一组权值&#xff0c;可能存在不同构的多棵哈夫曼树&#xff0c;但树的带权路径长度最小且唯一哈夫曼树…

SpringBoot常见注解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

《微信小程序开发从入门到实战》学习十七

3.3 开发创建投票页面 3.3.4使用input输入框组件 现在form组件不包含任何内容&#xff0c;预览效果空白。 现在添加一个input组件作为投票标题的输入框&#xff0c;createVote.wxml代码如下: <view class"container"> <form bindsubmit"formSubmi…

本地私域线上线下 线上和线下的小程序

私域商城是一种新型的零售模式&#xff0c;它将传统的线下实体店与线上渠道相结合&#xff0c;通过会员、营销、效率等方式&#xff0c;为消费者提供更加便利和高效的购物体验。私域商城的发展趋势表明&#xff0c;它将成为未来零售业的重要模式&#xff0c;引领零售业的创新和…

《微信小程序开发从入门到实战》学习十九

3.3 开发创建投票页面 3.3.7 wx:for列表渲染 接下来为创建的投票页面添加一个“添加选项”的功能。需要用户输入文字&#xff0c;应该使用input组件。头投票的数量是不确定的&#xff0c;面对不确定数量的组件的情况时&#xff0c;可以使用wx:for属性对组件进行列表渲染。 使…

算法之回溯

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

C语言之qsort()函数的模拟实现

C语言之qsort()函数的模拟实现 文章目录 C语言之qsort()函数的模拟实现1. 简介2. 冒泡排序3. 对冒泡排序进行改造4. 改造部分4.1 保留部分的冒泡排序4.2 比较部分4.3 交换部分 5. bubble_sort2完整代码6. 使用bubble_sort2来排序整型数组7. 使用bubble_sort2来排序结构体数组7.…