创建基于固件库的stm32程序模板并实现流水灯

发布者:Shuangfei最新更新时间:2019-10-19 来源: eefocus关键字:固件库  stm32  程序模板  流水灯 手机看文章 扫描二维码
随时随地手机看文章

一、准备

 Keil mdk514


下载STM32F10x_StdPeriph_Lib_V3.5.0固件库(百度搜索或http://download.csdn.net/detail/weboo10000/9084145).


示例芯片型号:STM32F103C8 


二、创建工程


 1. 创建工程目录:新建一个文件夹,起名为“Template工程模板”,在该文件夹下建立下图所示子文件夹

图1:工程文件目录结构


 2. 准备文件:复制固件库LibrariesSTM32F10x_StdPeriph_Driver下的2个文件夹到工程模板目录的FWLIB下;复制固件库LibrariesCMSISCM3CoreSupport下的文件到工程模板目录的CORE下;复制固件库LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm下的startup_stm32f10x_XX.s到到工程模板目录的CORE下;复制固件库LibrariesCMSISCM3DeviceSupportSTSTM32F10x下的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h到工程模板的USER目录;复制固件库ProjectSTM32F10x_StdPeriph_Template下的main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h到工程模板的USER目录。

其中startup_stm32f10x_XX.s文件由以下说明确定:


startup_stm32f10x_hd.s:大容量产品启动文件


startup_stm32f10x_md.s:中容量产品启动文件


startup_stm32f10x_ld.s:小容量产品启动文件

图2:上表来自《STM32数据手册》


根据《STM32选型手册》得知:

图3 选型手册截图


STM32F103C8是中容量产品,应使用startup_stm32f10x_md.s;


STM32F103ZE是大容量产品,应使用startup_stm32f10x_hd.s。


3.创建工程:打开Keil uVision5,选Project->New uVision Project…创建工程,取名为Template并选择工程目录的USER目录保存;在弹出的设备选择页面中选择相应的设备型号,例如STM32F103C8,选择ok.

图4 创建工程


 4.添加文件:这步主要是将步骤2中准备的文件添加到工程中。在Project视图中右键Target1选择Manage Project Items…出现工程文件管理界面。


图5 


如图5右,在Project Targets中添加Template_Flash,在Groups下新建USER,FWLIB,CORE,并在每个分组中添加步骤2中工程目录对应文件夹下的所有.c和.s文件,单击ok完成。


结果如图6:


图6


5.工程配置:单击Keil工具栏中的魔术棒图标(optionfor target…)


(1)Target标签设置如下(图7),如果正确选择器件型号则无需修改红框中内容。

图7


(2)Output标签和Listing标签:单击按钮选择obj文件保存位置为工程模板目录的OBJ目录,勾选红框中的选项。Listing标签下只需修改链接文件保存位置为工程模板目录的LIST即可。


 

图8


(3)C/C++标签:preprocessor Symbols的define中填入定义:STM32F10X_XD,USE_STDPERIPH_DRIVER;在Include Paths中添加在该工程目录中所有包含.h文件的目录路径。  注意!!!其中:STM32F10X_XD由芯片容量决定,小容量,中容量,大容量Flash(参见步骤2)的芯片分别应写成:STM32F10X_LD,STM32F10X_MD,STM32F10X_HD。

图9


(4)BEBUG和Utilities标签:a如果要用仿真器调试和下载需在右侧选择相应的仿真器,并单击settings出现的设置页面选择Flash Download设置如图所示,勾选Reset and Run(若正确选择器件型号,flash编程算法和RAM地址都无需再配置),Utilities标签下Settings同理;b.软件仿真则勾选左侧的Use Simulator即可。

图10

图11


6.最后修改:将stm32f10x_it.c文件的SysTick_Handler函数注释掉;打开main.c文件替换如下:



#include "stm32f10x.h"

u16 DelayCounter=0;

void Delay_Init()

{

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);    //Systick时钟源

SysTick_Config(SystemCoreClock / 1000); //初始化systick,时钟为HCLK,并开启中断每毫秒中断

}

 

void SysTick_Handler(void)

{

if(DelayCounter!=0)

{

DelayCounter--;

}

}

 

void Delayms(u16 ms)

{

DelayCounter=ms;

while(DelayCounter!=0);

}

 

 int main(void)

 {

  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5; //LED0-->PA.1 PA.3 PA.5 端口配置

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz

  GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA

  GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5); //输出高 

  Delay_Init();

  while(1)

 {

    GPIO_SetBits(GPIOA,GPIO_Pin_1);

    GPIO_SetBits(GPIOA,GPIO_Pin_3);

            GPIO_ResetBits(GPIOA,GPIO_Pin_5);

    Delayms(500);

    GPIO_SetBits(GPIOA,GPIO_Pin_1);

    GPIO_ResetBits(GPIOA,GPIO_Pin_3);

    GPIO_SetBits(GPIOA,GPIO_Pin_5);

    Delayms(500);

    GPIO_ResetBits(GPIOA,GPIO_Pin_1);

    GPIO_SetBits(GPIOA,GPIO_Pin_3);

    GPIO_SetBits(GPIOA,GPIO_Pin_5);

    Delayms(500);

 }

 }

最后单击Build(F7)按钮成功编译

图 12


三、下载运行或调试


创建工程并编译通过后,即可进行下载测试,将Jlink链接到PC并安装完驱动,另外一端连接到STM32F103C8开发板JTAG接口并供电;单击Keil mdk软件的Download按钮即可下载程序,还可点击Debug按钮进行单步调试。(STM32芯片的BOOT引脚都要接地)

图13

关键字:固件库  stm32  程序模板  流水灯 引用地址:创建基于固件库的stm32程序模板并实现流水灯

上一篇:【STM32】入门 · 流水灯
下一篇:STM32F103流水灯实验

推荐阅读最新更新时间:2024-11-17 15:04

stm32 直接操作寄存器开发环境配置
操作stm32 有使用官方库函数(参见 stm32 开发环境MDK+库文件配置 )和 直接操作寄存器的方法 直接操作寄存器的方法 会比库函数的方法效率更高 而且代码量会比较少 例如 在库函数下 配置一个GPIO口 需要 GPIO_InitTypeDef GPIO_InitStructure; //结构体 初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPI
[单片机]
STM32_USB_CDC学习笔记
USB虚拟串口的接收方式: USB 虚拟串口的接收采用中断方式,芯片在接收到数据后回触发中断调用CDC_Receive_FS()函数来处理接收到的数据. USB虚拟串口一次最多接收64个字节的数据,如果收到的数据大于64个字节则会连续多次调用CDC_Receive_FS()函数来处理接收到的数据. 问题: 每次下载完成程序后,必须重新插拔USB线,PC才能识别到串口设备? 解决方法:在每次USB初始化之前,配置USB的两个引脚拉低几个ms,即可让PC重新枚举该USB设备. 函数功能 USB发送 USBD_CDC_SetTxBuffer()和USBD_CDC_TransmitPacket()函数是启动数据发送过程的一
[单片机]
STM32学习笔记之 DS18B20 SEARCH ROM
使用说明,根据MCU不同 用户只需修改4函数 //单总线复位函数 int OWReset(); 单线总线的复位函数,注意这个要做相应修改,如果期间存在要返回1,期间不存在返回0, 直接从总线上读取的是期间存在返回0,不存在返回1 //向总线发送一个字节 void OWWriteByte(unsigned char dat); //向总线发送一位 void OWWriteBit(unsigned char bit_value); //读取总线一位 unsigned char OWReadBit(); 使用时用 int OWFirst();发现第一个单线器件 如果期间存在返回1,并且把ID存在 unsigned char
[单片机]
串行通信 软件仿真STM32与74LS164通信
1、串行通信 2、常见的4种串行通信标准 3、对74LS164芯片的介绍 74LS164:串行转并行芯片,内部是1个8位的移位寄存器组成,由8个D触发器组成 缺点是:不带锁存寄存器,移位寄存器移位的过程会表现在164的输出引脚上,容易产生输出干扰。 4、用KEIL4进行软件仿真时,按正常步骤建立工程,然后在下图位置按照下图设置即可。 5、软件仿真:STM32与74LS164进行通信的程序如下: /**************************************************************************************************
[单片机]
串行通信 软件仿真<font color='red'>STM32</font>与74LS164通信
STM32的GPIO的复用功能和重映射功能
1、复用功能:内置外设是与I/O口共用引出管脚(不同的功能对应同一管脚) STM32 所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。 2、重映射功能:复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功能的引出脚位是可通过程序改变到其他的引脚上! 直接好处:PCB电路板的设计人员可以在需要的情况下,不必把某些信号在板上绕一大圈完成联接,方便了PCB的设计同时潜在地减少了信号的交叉干扰。 如:USART1: 0: 没有重映像(TX/PA9,RX/PA10); 1: 重映像(TX/PB6,RX/PB7)。 (参考AFIO_MAPR寄存器介
[单片机]
STM32实现命令行
一、前言 工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行工具,有几个不错的开源 cmd 交互工具,主要看了 finsh和 nr_micro_shell 两个开源项目。Finsh 功能上限较多,但资源占用比较高,nr 有基本功能,且占用 MCU 资源较少,Github 给出的对比列表如下: Nr 和 Finsh 编译资源对比: 原始工程 添加nr_micro_shell增加量 添加finsh增加量 ROM 63660 +3832 +26908 RAM 4696 +1104 +1304 综合衡量了一下,移植 nr 作为后续项目的一个命令行交互。本篇文章分
[单片机]
在<font color='red'>STM32</font>实现命令行
基于STM32设计的指针式电子钟与日历
1. 项目简介 这是基于STM32设计的一个指针式电子钟+万年历小项目,采用3.5寸的LCD屏显示时钟,日历、温度、天气,支持触摸屏调整设置时间,设置闹钟,查看日历等等。整体项目主要是技术点就是LCD屏的图形绘制。比如: 时钟的时针绘制、分针、秒针、表盘、日历绘制等等。 时钟的时间是直接采用STM32本身的RTC时钟,室内的室温数据采用DS18B20温度传感器获取,STM32芯片的具体型号是STM32F103ZET6,只要是STM32F1系列的开发板,代码都是可以通用的 LCD显示屏采用的正点原子的3.5寸TFT显示屏,支持8080时序,自带触摸屏功能,触摸屏是电阻屏,驱动芯片是XPT2046,SPI接口,通信非常方便。
[单片机]
基于<font color='red'>STM32</font>设计的指针式电子钟与日历
关于STM32的USART_GetFlagStatus和USART_GetITStatus解析(异步通信)
前言 STM32固件库中提供了串口收发的标志位函数,包括USART_GetFlagStatus(…,…);和USART_GetITStatus(…,…);,两者容易混淆,重点区别就在于:前者返回值是中断标志位状态(读SR寄存器),后者返回值是中断发生与否的判断(读CR寄存器),以下主要对这两个函数进行分析。 一、USART_GETFlagStatus(…,…) /** * @brief Checks whether the specified USART flag is set or not. * @param USARTx: Select the USART or the UART peripheral. *
[单片机]
关于<font color='red'>STM32</font>的USART_GetFlagStatus和USART_GetITStatus解析(异步通信)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved