首页 > 其他分享 >嵌入式开发学习笔记1——keil软件入门

嵌入式开发学习笔记1——keil软件入门

时间:2024-03-30 14:00:33浏览次数:32  
标签:HAL 入门 Keil keil 嵌入式 学习 GPIO RCC

学习笔记(2024.3.30)

引言

从对几个问题的思考入手:

1、keil是什么?干什么用的?有什么优点?

2、keil从哪里下载?怎么安装?

3、keil学习路线图怎么比较合理?学习的顺序?

4、怎么快速用起来?

1、keil是什么?干什么用的?有什么优点?

keil软件介绍

Keil是一款单片机开发环境,主要研发8051微控制器C编译器,后面衍生出了编辑器、宏汇编器、链接器、调试器等众多工具套件(参考资料1)。Keil提供了一个集成的开发环境,可以方便地进行代码编写、编译、下载、调试和测试等操作,大大提高了开发效率和软件质量(参考资料2)。Keil支持多种芯片体系结构,如ARM、8051、C251等,可以满足不同类型的嵌入式系统开发需求(参考资料2)。Keil还提供了一系列易用的集成开发环境(IDE),可以帮助用户快速地开发和调试嵌入式应用程序,而且具有高度的可靠性和稳定性(参考资料3)。

KEIL软件的主要功能和作用包括以下几个方面:

  1. 提供集成化的开发环境:KEIL提供了一个集成的开发环境,可以方便地进行代码编写、编译、下载、调试和测试等操作,大大提高了开发效率和软件质量。
  2. 支持多种芯片体系结构:KEIL支持多种芯片体系结构,如ARM、8051、C251等,可以满足不同类型的嵌入式系统开发需求。
  3. 提供强大的调试功能:KEIL提供了强大的调试功能,可以实时监测程序执行情况,查看变量值、寄存器状态、内存使用情况等信息,帮助用户快速定位和解决问题。
  4. 内置丰富的库函数和示例代码:KEIL内置了丰富的库函数和示例代码,可以方便用户进行开发,节省开发时间和精力。
  5. 可以连接多种仿真器和调试器:KEIL可以连接多种仿真器和调试器,支持在线调试和离线仿真,可以满足不同类型的嵌入式系统开发需求。

Keil作为嵌入式系统开发工具,具有以下几个优点:

  1. 跨平台支持:Keil支持多种操作系统和单片机体系结构,可以在Windows、Linux等操作系统上运行,并支持ARM、8051、Cortex-M等多种单片机体系结构。
  2. 易于使用:Keil提供了一个友好的用户界面,包括源代码编辑器、编译器、调试器和仿真器等组件,使得开发人员可以方便地编写和调试嵌入式应用程序。
  3. 支持多种编程语言:Keil支持多种编程语言,包括C、C++、ASM等,可以满足不同开发人员的需求。
  4. 丰富的API和库函数:Keil提供了丰富的API和库函数,可以方便地访问硬件资源,并通过模拟器和仿真器等工具来测试和验证代码的正确性。
  5. 高效的编译器:Keil提供了高效的编译器,可以快速编译并生成可执行文件,提高了开发效率。
  6. 强大的调试功能:Keil支持多种调试接口和外围设备,如JTAG、SWD、UART等,提供了强大的调试功能,可以方便地对嵌入式应用程序进行调试和测试。

2、keil从哪里下载?怎么安装?

2.1下载keil 

引用自某STM32教程光盘

由于软件的版权问题,我们无法在光盘提供Keil(MDK)开发软件,


在此告知您该软件的获取渠道:

1.该软件是由ARM公司提供的,可到其官网下载:
    http://www.keil.com/download/product/
  选择"MDK-ARM"产品下载,下载时它会要求填一个用户信息表,填完后即可下载。

2.百度搜索 MDK 下载
  网上会有一些提供破解版的程序,用于学习的目的,使用破解版的比较方便,
  且我们提供的一些例程,必需要是注册版(或破解版)的软件才能正常编译。 
  为避免纠纷,公司请使用正版软件,

--------------------------------------------------------
以下链接含MDK/Keil软件,F1/F4/F7芯片包及破解工具。

该分享由网友提供,免去了大家从官网更新芯片包下载慢的麻烦,
破解工具仅供学习交流使用,请支持正版。

百度云下载链接:http://pan.baidu.com/s/1bpc7Xmf

---------------------------------------------------------

2.2安装步骤

按照教程提示

安装提示

  • 1、安装路径不能带中文,必须是英文路径
  • 2、安装目录不能跟 51 的 KEIL 或者 KEIL4 冲突,三者目录必须分开
  • 3、KEIL5 的安装比起 KEIL4 多了一个步骤,必须添加 MCU 库,不然没法使用。
  • 4、如果使用的时候出现莫名其妙的错误,先百度查找解决方法,莫乱阵脚。

主要步骤

KEIL5安装

默认路径,填写用户信息时,全部填空格(键盘的 space 键)即可

安装 MCU Device 包

把下载好的包双击安装即可,安装路径选择跟 KEIL5 一样的安装路径,安装成功之后, 在 KEIL5 的 Pack Installer 中就可以看到我们安装的包,以后我们新建工程的时候,就有单 片机的型号可选。

破*解(仅用于学习,勿商用)

KEIL 如果不破*解的话,会有 32K 代码容量的限制,超过 32K 则编译不了。

Keil5最新注册机到2032_keil5注册机-CSDN博客

安装结果

 

3、keil学习路线图怎么比较合理?学习的顺序?

3.1中规中矩的答案

以下内容来自大模型回答,需谨慎参考。

Keil学习路线图可以按照以下顺序进行规划,以确保学习的合理性和高效性:

一、基础阶段

  1. 了解Keil的基本概念和功能
    • 掌握Keil是什么,它的主要应用领域和优势。
    • 熟悉Keil的主要功能模块,如项目管理、代码编辑、编译和调试等。
  2. 学习C语言基础知识
    • 作为嵌入式系统编程的主要语言,掌握C语言的基本语法、数据类型、运算符、控制结构等。
    • 学习C语言中的函数、指针、数组等高级特性。

二、进阶阶段

  1. 熟悉Keil的操作界面和常用工具
    • 掌握Keil的菜单栏、工具栏和状态栏等基本界面元素。
    • 学习使用Keil的代码编辑器、编译器和调试器等常用工具。
  2. 实践编写简单的嵌入式程序
    • 选择一个适合初学者的嵌入式项目,如LED闪烁、按键控制等。
    • 使用Keil创建项目、编写代码、编译和调试程序。

三、高级阶段

  1. 深入学习嵌入式系统原理
    • 掌握嵌入式系统的硬件架构、中断处理、串口通信等基本原理。
    • 学习嵌入式系统的外设接口、驱动程序开发等知识。
  2. 提升Keil的高级应用技能
    • 学习使用Keil的仿真功能进行程序验证和调试。
    • 掌握Keil的性能分析和优化工具,提高程序的执行效率。
  3. 实践复杂的嵌入式项目开发
    • 选择一个具有一定难度的嵌入式项目,如物联网设备、智能机器人等。
    • 使用Keil进行项目规划、代码编写、模块调试和系统集成。

四、扩展阶段

  1. 学习其他与Keil相关的技术
    • 了解与Keil配合使用的其他工具和技术,如Proteus仿真软件、JTAG调试器等。
    • 学习使用Keil进行跨平台开发,如ARM、DSP等不同架构的处理器。
  2. 参与开源项目或实际项目开发
    • 参与一些开源的嵌入式项目,学习他人的代码和开发经验。
    • 尝试在实际项目中应用Keil进行开发,积累实践经验。

五、持续学习与提升

  1. 关注行业最新动态和技术发展
    • 定期浏览嵌入式系统领域的专业网站、论坛和博客,了解最新技术动态和趋势。
    • 参加嵌入式系统相关的学术会议和培训班,与同行交流学习。
  2. 不断挑战自己,提升技能水平
    • 尝试解决更复杂、更具挑战性的嵌入式系统问题。
    • 不断学习和掌握新的技术工具和方法,提升自己的竞争力。

通过以上五个阶段的学习和实践,你可以逐步掌握Keil的使用技巧,并在嵌入式系统开发中熟练应用它。同时,保持持续学习和提升的态度,不断挑战自己,将有助于你在这个领域取得更好的成就。

3.2自己总结(占坑待填)

占坑待填

占坑待填

占坑待填

4、怎么快速用起来?

在软件中新建工程→新建.c文件→编写程序→项目设置(Target 1” --> "Options for 'Target 1'";输出"Output"一栏勾选“Create HEX File”)→编译程序→下载程序到开发或者用Proteus创建仿真模型进行仿真验证。

参考资料3,基于51单片机的 一个简单的LED灯模型创建并Proteus创建仿真模型进行仿真验证使用。参考资料4,编码之前的操作步骤很详细,两个资料结合着用

51的程序在stm32上可能不能直接照搬,文心一言给的。等我有基础后再测试,占坑待填。

/**  
  * @brief  主程序入口  
  * @param  无  
  * @retval 无  
  */  
int main(void)  
{  
    HAL_Init(); // 初始化HAL库  
  
    // 配置系统时钟为72MHz  
    SystemClock_Config();  
  
    // 初始化GPIOA,并设置PA0为输出  
    __HAL_RCC_GPIOA_CLK_ENABLE();  
    GPIO_InitTypeDef GPIO_InitStruct = {0};  
    GPIO_InitStruct.Pin = GPIO_PIN_0;  
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  
    GPIO_InitStruct.Pull = GPIO_NOPULL;  
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  
  
    // 主循环  
    while (1)  
    {  
        // 点亮LED  
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);  
          
        // 延时一段时间,例如500ms  
        HAL_Delay(500);  
          
        // 熄灭LED  
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);  
          
        // 延时一段时间,例如500ms  
        HAL_Delay(500);  
    }  
}  
  
/**  
  * @brief  系统时钟配置  
  * @param  无  
  * @retval 无  
  */  
void SystemClock_Config(void)  
{  
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};  
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};  
  
    // 配置HSE为系统时钟源  
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;  
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;  
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;  
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;  
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)  
    {  
        // 初始化错误处理  
        Error_Handler();  
    }  
  
    // 配置系统时钟  
    RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);  
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;  
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;  
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  
  
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)  
    {  
        // 初始化错误处理  
        Error_Handler();  
    }  
  
    // 配置HCLK时钟频率为72MHz  
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  
  
    // 配置SysTick中断优先级  
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);  
  
    // 启用SysTick中断  
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);  
    HAL_NVIC_EnableIRQ(SysTick_IRQn);  
}  
  
/**  
  * @brief  错误处理函数  
  * @param  无  
  * @retval 无  
  */  
void Error_Handler(void)  
{  
    // 用户可以在这里添加错误处理代码  
    while(1)  
    {  
    }  
}

在这个程序中,我们首先初始化HAL库,然后配置系统时钟到72MHz。接着初始化GPIOA端口,并设置PA0为输出。在while循环中,我们通过HAL_GPIO_WritePin函数交替地设置和清除PA0引脚的状态,以实现LED的间歇点亮。使用HAL_Delay函数引入延时,以便可以看到LED的闪烁效果。

在编写和运行上述STM32F103ZET6上的LED间歇点亮程序时,有几个注意事项需要牢记:

  1. 时钟配置:确保系统时钟配置正确。STM32F103ZET6的时钟系统比较复杂,需要根据具体的硬件设计和需求来配置HSE、PLL等参数。

  2. 外设初始化:在程序中,我们首先初始化了GPIOA端口。这是非常重要的步骤,因为STM32的GPIO引脚默认处于输入模式,并且可能带有内部上拉或下拉电阻。在使用前必须正确配置引脚的模式、输出类型、速度和上拉/下拉电阻。

  3. HAL库函数:使用HAL库可以简化底层硬件操作的编写,但需要注意函数调用的顺序和参数设置。例如,在调用HAL_GPIO_WritePin之前,必须确保对应的GPIO端口已经初始化。

  4. 延时函数:程序中使用了HAL_Delay函数来实现延时。这个函数的精度依赖于系统时钟和SysTick的配置。对于需要精确延时的应用,可能需要使用更高级的定时器或实时时钟(RTC)。

  5. 中断处理:在程序中没有使用中断,但在复杂的应用中,中断是处理异步事件的重要机制。如果程序中使用中断,需要确保中断服务程序(ISR)正确编写,并且中断优先级配置得当。

  6. 错误处理:程序中包含了一个简单的Error_Handler函数,用于处理初始化错误。在实际应用中,可能需要添加更详细的错误检测和处理机制。

  7. 调试和测试:在编写和调试程序时,建议使用STM32CubeMX等工具生成初始化代码,这样可以减少出错的可能性。此外,使用调试器(如Keil uVision的调试器)可以实时查看变量和寄存器的值,有助于定位和解决问题。

  8. 硬件连接:确保LED正确连接到STM32F103ZET6的PA0引脚,并且LED的正负极连接正确。否则,LED可能无法正常工作或损坏。

  9. 电源和接地:确保STM32开发板或系统的电源稳定,并且所有部件都正确接地。不稳定的电源可能导致程序运行异常或硬件损坏。

  10. 固件更新和库文件:保持STM32CubeMX、HAL库和Keil uVision等工具的版本更新,以便利用最新的功能和修复。

遵循这些注意事项可以帮助您成功编写和运行STM32F103ZET6上的LED间歇点亮程序。

5、其它-单片机入门路线参考

看到一篇嵌入式开发学习路线和知识点整理的思维导图文章,供借鉴参考。

肝了半个月,我整理出了这篇嵌入式开发学习学习路线+知识点梳理)_嵌入式学习路线-CSDN博客

知乎这位大佬也有很多干货,大概浏览一下有个感性认识:

单片机入门到高级开挂学习路径(附教程+工具) - 知乎 (zhihu.com)

谁能教教我怎么学单片机,先学什么,怎么入门? - 知乎 (zhihu.com)

(2 封私信 / 26 条消息) 为什么我学了几天 STM32 感觉一脸茫然? - 知乎 (zhihu.com)

6、参考资料

参考资料1

Keil科普教程 | Keil的发展历史 - 知乎 (zhihu.com)

参考资料2

https://www.eefocus.com/baike/495948.html

参考资料3

1.KEIL的基本使用操作 - 知乎 (zhihu.com)

参考资料4

keil软件是干嘛的?keil软件怎么用? - 知乎 (zhihu.com)

标签:HAL,入门,Keil,keil,嵌入式,学习,GPIO,RCC
From: https://blog.csdn.net/weixin_50151928/article/details/137165205

相关文章

  • Kubernetes超详细教程,一篇文章帮助你从零开始学习k8s,从入门到实战
    k8s概述k8sgithub地址:https://github.com/kubernetes/kubernetes官方文档:https://kubernetes.io/zh-cn/docs/home/k8s,全程是kubernetes,这个名字源于希腊语,意为"舵手"或"飞行员”k8s这个缩写是因为k和s之间有八个字符Google在2014年开源了k8s项目,k8s是一个......
  • SVG XML 格式定义图形入门介绍
    SVGSVGmeansScalableVectorGraphics.SVG使用XML格式定义图形SVG图像在放大或改变尺寸的情况下其图形质量不会有所损失SVG是万维网联盟的标准HelloWorldUseSVGinhtmlandyoucansee:LinktotheSVGfileYoucanuse<a>tagtolinktothes......
  • 1.java openCV4.x 入门-环境搭建
    专栏简介......
  • 【C++】C到C++的入门知识
    目录1、C++关键字2、命名空间2.1命名空间的定义2.2命名空间的使用2.2.1 加命名空间名称及作用域限定符2.2.2使用using将命名空间中某个成员引入2.2.3使用usingnamespace命名空间名称引入3、C++输入&输出4、缺省参数 4.1缺省参数的概念4.2缺省参数的分类......
  • Node.js入门:常用命令一览
    I.引言A.介绍Node.js的概念和应用场景Node.js是一个开源的、跨平台的JavaScript运行时环境,它可以用于服务器端的JavaScript应用程序开发。Node.js具有高性能、轻量化、易使用的特点,在Web应用、网络服务、数据交换等多个领域有着广泛的应用。Node.js使用事件驱动、非阻塞I/O......
  • node.js 入门案例 安装教程
    前言Node.js是一个基于ChromeJavaScript运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。可以让JavaScript在服务器端运行。它具有轻量级、高效、事件驱动、非阻塞I/O等特点,被广泛应......
  • gRPC入门学习之旅(四)
    gRPC入门学习之旅(一)gRPC入门学习之旅(二)gRPC入门学习之旅(三)实现定义的服务9.在“解决方案资源管理器”中,使用鼠标左键选中“Services”文件夹,然后在菜单栏上,依次选择“添加-->新建项”。10.在“添加新项”对话框中,选择“ASP.NETCore-->代码”节点,然后选择“类”项。......
  • Kotlin项目入门
    KoTest官方使用文档对于kotlin项目的测试使用koTest首先要安装KoTest插件,然后gradle引入插件testImplementation("io.kotest:kotest-runner-junit5:5.7.2")testImplementation("io.kotest:kotest-runner-junit5-jvm:5.7.2")代码使用方式:classMainTest:FunSpec({......
  • 中间件 ZK分布式专题与Dubbo微服务入门 6-2 zk会话重连机制
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12718 1重点关注1.1本节内容验证了使用sessionid和sessionPassword重连的session和之前的session一致,详见3.1   2课程内容2.1扩展之:echodump|nclocalhost2181......
  • jg学习嵌入式(embadded)的第一天
    学习嵌入式(embadded)的第一天C语言运行机制流程编写源文件->预处理->编译(得到汇编文件)->汇编(得到目标文件)->与库文件进行连接(得到可执行文件)->执行标识符(一切程序员自己定义的变量)规范强制规范严格区分大小写只能用英文或数字和下划线组成不能以数字开头不能是关......