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