三、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配置为xxif (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、完整工程下载地址

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++多线程编程(2):四种线程管理方法

文章首发于我的个人博客:欢迎大佬们来逛逛 文章目录 线程管理get_idsleep_forsleep_untilyield 线程管理 有一个this_thread的名称空间中定义了许多的线程管理方法: get_id:获取当前线程idsleep_for:当前线程休眠一段时间sleep_…

Python将已标注的两张图片进行上下拼接并修改、合并其对应的Labelme标注文件

Python将已标注的两张图片进行上下拼接并修改、合并其对应的Labelme标注文件 前言前提条件相关介绍实验环境上下拼接图片并修改、合并其对应的Labelme标注文件代码实现输出结果 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容&#xff…

第20章 数据库编程

通过本章需要理解JDBC的核心设计思想以及4种数据库访问机制,理解数据库连接处理流程,并且可以使用JDBC进行Oracle数据库的连接,理解工厂设计模式在JDBC中的应用,清楚地理解DriverManager类的作用,掌握Connection、Prep…

HR人才测评,提高招聘效率降低用人风险

随着社会的不断进步,越来越多的企业在人力资源管理中,引入人才测评工具。人才是构成一个企业的基础,是企业不断发展的保障,同时,人才也是一个企业的核心竞争力之一。所以,人才的素质对一个企业至关重要。现…

Halcon (4):如何开始自学

文章目录 文章专栏前言Halcon文档Halcon基础案例文档英语阅读建议 结论 文章专栏 Halcon开发 前言 在我完成上一篇代码,halcon基础窗口事件写完了之后,我已经基本掌握了如何写一个简单的halcon程序。后面我学习新的知识的时候感觉遇到了瓶颈。因为网上没…

测试老鸟总结,Web/APP与接口测试测试流程总结,避背黑锅...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、web测试流程 …

【linux网络】解读FTP文件传输服务器配置,揭秘百度云下载限速原理

目录 一、FTP文件传输协议 1.1FTP工作原理 1.2两种模式介绍 1.3FTP状态码 1.4FTP的三种用户分类 二、vsftpd软件的介绍 2.1服务端介绍 2.2不同操作系统下的客户端登录操作 三、vsftpd的常见配置 3.1修改默认的命令端口 3.2限制匿名用户登录(系统原本是默…

不知道如何制作产品图册的,赶紧收藏住!

产品图册是展示产品外观、功能和特点的重要工具,对于销售和推广产品至关重要。然而,制作一本高质量的产品图册并不是一件容易的事情。如果你没有经验或者不确定如何着手,那么这篇文章将为你提供一些实用的建议和技巧,帮助你轻松制…

自定义业务异常处理类加入全局处理器中

自定义业务异常处理类并将其加入全局异常处理器,从而避免业务层直接处理异常造成代码污染,达到业务清晰简洁。 描述 在进行分类模块开发时,删除某个分类时当分类关联了菜品和套餐时,是不允许删除的。我们在管理端删除的时候会提示…

基于冠状病毒群体免疫算法优化概率神经网络PNN的分类预测 - 附代码

基于冠状病毒群体免疫算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于冠状病毒群体免疫算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于冠状病毒群体免疫优化的PNN网络5.测试结果6.参考文献7.Matlab代码 …

【kafka】使用docker启动kafka

1.环境准备 docker拉取zookeeper镜像 docker pull zookeeper:3.4.14 创建zookeeper容器,默认端口号为2181 docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14 拉取kafka镜像 docker pull wurstmeister/kafka:2.12-2.3.1 创键kafka容器&#xff…

pom.xml格式化快捷键

在软件开发和编程领域,"格式化"通常指的是将代码按照一定的规范和风格进行排列,以提高代码的可读性和维护性。格式化代码有助于使代码结构清晰、统一,并符合特定的编码规范。 格式化可以包括以下方面: 缩进&#xff1a…