学习笔记(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软件的主要功能和作用包括以下几个方面:
- 提供集成化的开发环境:KEIL提供了一个集成的开发环境,可以方便地进行代码编写、编译、下载、调试和测试等操作,大大提高了开发效率和软件质量。
- 支持多种芯片体系结构:KEIL支持多种芯片体系结构,如ARM、8051、C251等,可以满足不同类型的嵌入式系统开发需求。
- 提供强大的调试功能:KEIL提供了强大的调试功能,可以实时监测程序执行情况,查看变量值、寄存器状态、内存使用情况等信息,帮助用户快速定位和解决问题。
- 内置丰富的库函数和示例代码:KEIL内置了丰富的库函数和示例代码,可以方便用户进行开发,节省开发时间和精力。
- 可以连接多种仿真器和调试器:KEIL可以连接多种仿真器和调试器,支持在线调试和离线仿真,可以满足不同类型的嵌入式系统开发需求。
Keil作为嵌入式系统开发工具,具有以下几个优点:
- 跨平台支持:Keil支持多种操作系统和单片机体系结构,可以在Windows、Linux等操作系统上运行,并支持ARM、8051、Cortex-M等多种单片机体系结构。
- 易于使用:Keil提供了一个友好的用户界面,包括源代码编辑器、编译器、调试器和仿真器等组件,使得开发人员可以方便地编写和调试嵌入式应用程序。
- 支持多种编程语言:Keil支持多种编程语言,包括C、C++、ASM等,可以满足不同开发人员的需求。
- 丰富的API和库函数:Keil提供了丰富的API和库函数,可以方便地访问硬件资源,并通过模拟器和仿真器等工具来测试和验证代码的正确性。
- 高效的编译器:Keil提供了高效的编译器,可以快速编译并生成可执行文件,提高了开发效率。
- 强大的调试功能: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 则编译不了。
安装结果
3、keil学习路线图怎么比较合理?学习的顺序?
3.1中规中矩的答案
以下内容来自大模型回答,需谨慎参考。
Keil学习路线图可以按照以下顺序进行规划,以确保学习的合理性和高效性:
一、基础阶段
- 了解Keil的基本概念和功能:
- 掌握Keil是什么,它的主要应用领域和优势。
- 熟悉Keil的主要功能模块,如项目管理、代码编辑、编译和调试等。
- 学习C语言基础知识:
- 作为嵌入式系统编程的主要语言,掌握C语言的基本语法、数据类型、运算符、控制结构等。
- 学习C语言中的函数、指针、数组等高级特性。
二、进阶阶段
- 熟悉Keil的操作界面和常用工具:
- 掌握Keil的菜单栏、工具栏和状态栏等基本界面元素。
- 学习使用Keil的代码编辑器、编译器和调试器等常用工具。
- 实践编写简单的嵌入式程序:
- 选择一个适合初学者的嵌入式项目,如LED闪烁、按键控制等。
- 使用Keil创建项目、编写代码、编译和调试程序。
三、高级阶段
- 深入学习嵌入式系统原理:
- 掌握嵌入式系统的硬件架构、中断处理、串口通信等基本原理。
- 学习嵌入式系统的外设接口、驱动程序开发等知识。
- 提升Keil的高级应用技能:
- 学习使用Keil的仿真功能进行程序验证和调试。
- 掌握Keil的性能分析和优化工具,提高程序的执行效率。
- 实践复杂的嵌入式项目开发:
- 选择一个具有一定难度的嵌入式项目,如物联网设备、智能机器人等。
- 使用Keil进行项目规划、代码编写、模块调试和系统集成。
四、扩展阶段
- 学习其他与Keil相关的技术:
- 了解与Keil配合使用的其他工具和技术,如Proteus仿真软件、JTAG调试器等。
- 学习使用Keil进行跨平台开发,如ARM、DSP等不同架构的处理器。
- 参与开源项目或实际项目开发:
- 参与一些开源的嵌入式项目,学习他人的代码和开发经验。
- 尝试在实际项目中应用Keil进行开发,积累实践经验。
五、持续学习与提升
- 关注行业最新动态和技术发展:
- 定期浏览嵌入式系统领域的专业网站、论坛和博客,了解最新技术动态和趋势。
- 参加嵌入式系统相关的学术会议和培训班,与同行交流学习。
- 不断挑战自己,提升技能水平:
- 尝试解决更复杂、更具挑战性的嵌入式系统问题。
- 不断学习和掌握新的技术工具和方法,提升自己的竞争力。
通过以上五个阶段的学习和实践,你可以逐步掌握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间歇点亮程序时,有几个注意事项需要牢记:
时钟配置:确保系统时钟配置正确。STM32F103ZET6的时钟系统比较复杂,需要根据具体的硬件设计和需求来配置HSE、PLL等参数。
外设初始化:在程序中,我们首先初始化了GPIOA端口。这是非常重要的步骤,因为STM32的GPIO引脚默认处于输入模式,并且可能带有内部上拉或下拉电阻。在使用前必须正确配置引脚的模式、输出类型、速度和上拉/下拉电阻。
HAL库函数:使用HAL库可以简化底层硬件操作的编写,但需要注意函数调用的顺序和参数设置。例如,在调用
HAL_GPIO_WritePin
之前,必须确保对应的GPIO端口已经初始化。延时函数:程序中使用了
HAL_Delay
函数来实现延时。这个函数的精度依赖于系统时钟和SysTick的配置。对于需要精确延时的应用,可能需要使用更高级的定时器或实时时钟(RTC)。中断处理:在程序中没有使用中断,但在复杂的应用中,中断是处理异步事件的重要机制。如果程序中使用中断,需要确保中断服务程序(ISR)正确编写,并且中断优先级配置得当。
错误处理:程序中包含了一个简单的
Error_Handler
函数,用于处理初始化错误。在实际应用中,可能需要添加更详细的错误检测和处理机制。调试和测试:在编写和调试程序时,建议使用STM32CubeMX等工具生成初始化代码,这样可以减少出错的可能性。此外,使用调试器(如Keil uVision的调试器)可以实时查看变量和寄存器的值,有助于定位和解决问题。
硬件连接:确保LED正确连接到STM32F103ZET6的PA0引脚,并且LED的正负极连接正确。否则,LED可能无法正常工作或损坏。
电源和接地:确保STM32开发板或系统的电源稳定,并且所有部件都正确接地。不稳定的电源可能导致程序运行异常或硬件损坏。
固件更新和库文件:保持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