三、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...”。

三、LED闪烁_第1张图片

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

三、LED闪烁_第2张图片

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

三、LED闪烁_第3张图片

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

三、LED闪烁_第4张图片

3、移植库文件

3.1、下载库函数和例程。

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

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

三、LED闪烁_第5张图片

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

三、LED闪烁_第6张图片

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

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

(2)复制Device文件。

三、LED闪烁_第7张图片

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

三、LED闪烁_第8张图片

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

(1)打开Keil。

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

三、LED闪烁_第9张图片

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

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

三、LED闪烁_第10张图片

(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)检查添加的文件类型是否错误。(在当前环境下就会出现这个问题)

三、LED闪烁_第11张图片

(2)如下页面配置检查

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

三、LED闪烁_第12张图片

(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、完整工程下载地址

你可能感兴趣的:(灵动MM32单片机,mm32,灵动微电子,C,单片机)