兵团建设环保局网站,太原制作公司网站,做基因功能注释的网站,已经收录大规模修改收录页面对网站有影响吗本篇文章介绍了使用Keil来对STM32F103C8芯片进行初始工程搭建#xff0c;以及开发与工程调试的完整过程#xff0c;帮助读者能够在实战中体会到Keil这个开发环境的使用方法#xff0c;了解一个嵌入式工程从无到有的过程#xff0c;并且具备快速搭建一个全新芯片对应最小软件… 本篇文章介绍了使用Keil来对STM32F103C8芯片进行初始工程搭建以及开发与工程调试的完整过程帮助读者能够在实战中体会到Keil这个开发环境的使用方法了解一个嵌入式工程从无到有的过程并且具备快速搭建一个全新芯片对应最小软件工程的基本能力思路。文章首先介绍了基础工程搭建的过程包括代码的组织以及Keil嵌软工程配置然后讲述了一个简单功能的开发最后介绍了Keil环境下提供的代码调试工具以及一些常用工具配置项。 目录
Keil概念
工程搭建
代码组织
Keil配置
开发与调试
下载调试准备
串口打印开发
代码调试 Keil概念
Keil全称Keil µVision IDE是一款集成开发环境IDE主要用于嵌入式系统的开发。Arm Keil MDK(Microcontroller Development Kit)是面向基于Arm的微控制器的最全面的软件开发解决方案包括创建、构建和调试嵌入式应用所需的所有组件。主要可以分为MDKIDE以及芯片对应编译器等、Softwarepacks可以随时添加软件包这使得新的设备支持和中间件更新独立于工具链、Debug ProbesMDK 支持许多不同的调试和跟踪适配器。 下面介绍一下后面工程搭建以及开发调试涉及的相关概念。
STM32F10x_StdPeriph_Lib_V3.6.0芯片底层库文件我们这里使用的是STM芯片F10系列响应的库文件可以从ST官网找到点击这里可直接跳转并下载。Libraries中主要包含CMSIS和STM32F10x_StdPeriph_Driver。Project中主要包含STM32F10x_StdPeriph_Template和STM32F10x_StdPeriph_Examples。前者是后者为不同芯片内部外设使用示例。 CMSIS:全称为Cortex Microcontroller Software Interface Standard,其中startup文件夹包含了对应芯片类型的启动代码core_cm3.c包括复位处理程序和异常向量CoreSupport文件夹中包含了STM32F10系列芯片使用的Cortex-M3内核外设接入层startup_stm32f10x_md.s(md表示芯片容量)。STM32F10x_StdPeriph_DriverSTM32F10系列标准的外设驱动库提供诸如ADC,CAN,GPIO等芯片内外设驱动。STM32F10x_StdPeriph_Template工程必备的不同IDE文件以及相关代码源文件模板其中stm32f10x_conf.h包含了外设库头文件以及参数检查宏定义stm32f10x_it.c包含了所有的中断服务函数定义system_stm32f10x.c包含了芯片时钟配置。STM32F10x_StdPeriph_Examples芯片内部外设不同的使用示例可以根据实际项目使用参考终端服务函数以及main.c中的相关外设配置例如您如果用到了3ADCs并使用DMA则可以参考STM32F10x_StdPeriph_Examples\ADC\3ADCs_DMA下的代码进行配置。JLink仿真器德国SEGGER公司推出基于JTAG的仿真器。简单地说是给一个JTAG协议转换盒即一个小型USB到JTAG的转换盒其连接到计算机用的是USB接口而到目标板内部用的还是jtag协议。它完成了一个从软件到硬件转换的工作。我们使用它连接电脑与板卡实现程序烧录和在线调试。 工程搭建
代码组织
建立工程文件夹在工程文件夹下建立以下目录结构组织工程代码可根据公司规定对工程目录结构进行统一修改。
目录名称存放文件文件来源Startupstartup_stm32f10x_md.s STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\ DeviceSupport\ST\STM32F10x\startup\arm CMSIScore_cm3.c、core_cm3.h STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3 \CoreSupport Libraries芯片外设标准库文件 STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\STM32F10x _StdPeriph_Driver App 1.用户编写的业务代码可根据业务创建子目录。 2.main.c、stm32f10x_conf.h、stm32f10x_it.c、system_stm32f10x.c 1.用户编写/移植。 2.STM32F10x_StdPeriph_Lib_V3.6.0\Project\STM32F10x_ StdPeriph_Template Bulid用来存放编译生成文件Keil编译生成。 Keil配置
首先打开Keil5新建工程芯片型号选择STM32F103C8。随后弹出在线添加库文件关闭即可。如下图所示。 然后点击三色块用来添加工程目录并添加相关目录增加待编译源文件。如下图所示。 最后单击魔术棒进行配置这部分的配置比较多下面分步逐一进行介绍。
配置目标属性晶振等信息因为我现在用的单片机晶振为8M的所以改为8M下面调试需要用到printf函数需要勾选MicroLIB库。 输出文件夹改到Bulid文件夹勾选生成hex文件。 修改编译信息包括添加编译宏定义和头文件路径等。 配置Flash类型。
最后如果配置正确相关的文件也都正确添加至工程内编译之后就会在Build Output看到生成了可以下载执行的hex文件如果没有需要我们根据错误信息来逐步解决。 开发与调试
下载调试准备
首先我们需要安装JLINK驱动segger上或者百度如果驱动安装成功将设备usb接口插到电脑上后绿灯转为常亮电脑的设备管理在通用串行控制器中能够识别到仿真器。然后我们需要按照JTAG接口引脚定义正确将仿真器与板卡相连。 最后我们需要在Keil中根据我们仿真器类型正确配置Debug信息如下并选择相关仿真器窗口。 这是如果仿真器能够正常连接到板卡绿灯会闪烁点击Settings摁扭能看到识别到的芯片核心如果不正常则会为空白。 串口打印开发
我们开发一个串口打印的功能因为只是一个demo所以我们将串口初始化的部分也放到main.c里下面是main.c的代码。 #include stm32f10x.h
#include usart.hvoid uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1GPIOA时钟//USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, GPIO_InitStructure);//初始化GPIOA.9//USART1_RX GPIOA.10初始化GPIO_InitStructure.GPIO_Pin GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority0 ;//抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //IRQ通道使能NVIC_Init(NVIC_InitStructure); //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate bound;//串口波特率USART_InitStructure.USART_WordLength USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; //收发模式USART_Init(USART1, USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE); //使能串口1 }void USART1_IRQHandler(void)
{u8 Data;if(USART_GetITStatus(USART1,USART_IT_RXNE)!RESET){Data USART1-DR;}}///重定向c库函数printf到串口重定向后可使用printf函数
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口 */USART_SendData(USART1, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); return (ch);}int main(void)
{ uart_init(9600);while(1){printf(STM32\n);}
} 然后点击编译生成可执行文件之后点击下载到板卡。 最后正确连接板卡上的串口线到串口小板TTL转USB,打开串口调试助手就能看到板卡打印出来的串口信息。 代码调试
点击红色那个上面有个红色字母d的小放大镜摁扭就会下载程序并进入仿真模式这个时候程序停在起始位置。 按照上图的标号我们介绍一下相关区域的作用。
重启执行摁扭从左到右第一个为系统复位程序回到起始位置并停止执行。第二个为全速执行摁扭一般跟预先设置的断点配合使用。单步调试摁扭从左到右依次是进入执行会进入调用函数逐行执行不进入调用函数跳出执行执行到跳出此函数执行到光标处执行到蓝色光标处。代码走查常用。寄存器窗口这个串口可以看到ARM核心的一些特殊寄存器不知道用法的可以移步到《【硬件】嵌入式电子设计基础之单片机》文章去了解一下。这个页签中还有很多别的功能可供发掘诸如可以通过system中的系统变量sec来查看程序运行所用时间将两个地方的所用时间相减即可得到所间隔的时长。汇编代码窗口当前运行程序对应的汇编代码行可以在更细的层面调试程序。C代码窗口黄色光标指向当前运行到行在左侧深灰处双击即可添加断点可以看到红色小圆点。命令窗口Keil提供命令窗口可以在调试过程中执行命令诸如SAVE E:\Debug\DATA.txt 0x20004A18,0x20004A3A这段命令即可将0x20004A18~0x20004A3A这段内存区存储到文件中。调用栈:调用栈信息显示了当前代码处的完整调用关系有的时候当在中断服务函数中时无法看到进入中断之前的调用栈信息需要结合其他寄存器信息直接从栈空间中查找相关调用信息。
还有一些比较常用的调试窗口。memory窗口可以看指定区域的存储器数值正如上面提到的存储指令我们也可以通过memory窗口看到对应的内容。 还有就是Watch窗口可以添加一些变量在调试过程中观察变量的变化。 最后一个常用的就是系统外设窗口在调试过程中可以看到具体对应外设的寄存器值。 Keil环境补充说明
keil默认无法显示中文输入中文时出现的是问号。可以将Edit--Configuration中的编码改成GB2312解决这个问题,同时在这个页签中可以将Tab设置为4个空格。在Configuration还有更多诸如字体等环境配置读者可以根据自己的喜好来进行调整。 十六宿舍 原创作品转载必须标注原文链接。 ©2023 Yang Li. All rights reserved. 欢迎关注 『十六宿舍』大家喜欢的话给个更多关于嵌入式相关技术的内容持续更新中。