打印
[MM32生态]

LED闪烁

[复制链接]
138|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
通过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、完整工程下载地址

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_42727214/article/details/134484036

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

91

主题

4286

帖子

2

粉丝