使用编译环境为MDK5,烧录器将会使用JTAG和串口两种,芯片为STM32F103C8T6
零、前准备
1.MDK5编译环境
2.JTAG驱动或串口驱动
一、建立工程模板,写一个简单的小程序
1).创建工程目录
这里就会使用MDK创建工程了,由于STM32的工程已经比较大了,所以在工程目录下将会再创建多个目录,以便整理。
(说明一下,其实随便放都可以,只要工程都能包含以下说到的文件即可)
这里工程名就叫template吧(.代表工程目录):
.CORE 存放芯片内核驱动文件;
.FWLIB 使用库函数的话存放库函数;
.OBJ 存放编译生成文件;
.SYSTEM 存放系统代码;
.USER 存放工程文件,应用程序等。
新建好后就可以先把将会用到的文件放进去了,这里使用的是库函数3.5版本,
1.STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport下有两个文件core_cm3.c和core_cm3.h放进CORE文件夹中,是CM3的内核支持文件,其他使用 CM3 内核的芯片也可以用,不一定是 stm32。这两个文件用来获取设置 CM3 内核,配置一些内核寄存器;
2.STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm下有用汇编语言写的内核启动代码,根据容量选不同的代码,C8T6属于MD级别的,所以复制starup_stm32f10x_md.s到CORE文件夹中;
3.STM32F10x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10x_StdPeriph_Driver下就是各外设的库函数文件及其接口,直接把inc和src两个文件夹复制在FWLIB中;
4.STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x下有几个源码文件stm32f10x.h, system_stm32f10x.c, system_stm32f10x.h 和startup_stm32f10x_hd.s 在 DeviceSupport 目录下,说明这几个文件是和具体的芯片有关的,也就是 stm32 芯片的支撑文件。其中 stm32f10x.h 是标准外设库的入口,使用标准外设库的代码中必须包含该头文件。system_stm32f10x.c, system_stm32f10x.h 这两个文件提供函数用来初始化 stm32 芯片,配置 PLL、系统时钟和内置 flash 接口。这几个文件放在.USER里。
5.STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_Template下有三个文件stm32f10x_it.cstm32f10x_it.h,stm32f10x_conf.h复制到.USER文件夹中
2).创建MDK工程
1.打开MDK后选择project-->New uVision Project-->工程文件保存在USER里-->选择对应的芯片
2.在左边Project栏右键有个Manage Project Items,打开后将刚刚复制的文件都添加进去,注意不要忘了那个汇编语言写的.s文件
3.添加好后,再设置一下工程属性,Project-->Options for Target 'uCOS-II'
Output栏的Create HEX File要选上;
C/C++栏有个Include Paths里要把所有有inc文件的目录都添加上;
Debug栏这里改用J-LINK/J-TRACE Cortex。
4.修改一下文件内容
在 stm32f10x.h 的 66-73 行,根据所选芯片类型,去掉相应注释,这里我去掉STM32F10X_MD 行的注释(中容量型 stm32 芯片);
在 stm32f10x.h 的 去掉 105 行的 USE_STDPERIPH_DRIVER 注释,启用 stm32 标准外设库;
在 stm32f10x_conf.h 的 28-49 行可以把无需用到的库函数注释掉加快编译时间,同时把之前添加在工程里的库函数.c和.h文件去掉(这一步可在最后才做)。
5.就写一个LED灯闪亮的小程序
main.c
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include
#include "sys.h"
#include "delay.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
delay_init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //enable PB clock
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PB.8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_8); //Set bit
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
delay_ms(500);
GPIO_SetBits(GPIOB,GPIO_Pin_8);
delay_ms(500);
}
//return 0;
}
delay.c
#include "delay.h"
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//如果使用ucos,则包括下面的头文件即可.
static u8 fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数
}
//延时nus
//nus为要延时的us数.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; /加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;/加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
6.编译过了点击J-LINK下载即可,串口下载方法如下:
1).先在工程生成.hex文件,步骤入下图
打开项目设置
在output栏把生成hex文件勾上
再编译一次就可以找到hex文件在输出文件夹
2).用串口把开发板和电脑接好,这一点就不说了,记住txd-->rxd,rxd-->txd。
3).先了解一下stm32的自举模式,看stm32用户手册
正常的话我们是从主闪存器启动,现在我们需要从系统存储器启动,那这个怎么办到呢?我们需要手动拔跳线帽,在开发板上找找,肯定有的。
然后打开串口助手,导入hex文件,下载后重启就可以了。
上一篇:STM32总结之开启外设时钟
下一篇:STM32配置外设寄存器,不论怎么写都写不进去或全是0
推荐阅读最新更新时间:2024-11-04 05:04
设计资源 培训 开发板 精华推荐
- LT1109CN8 3V 至 5V 转换器的典型应用电路
- 【吉医ICAN大赛】灯光品质检测仪
- 使用 LTC3637HDHC 5V-76V 输入至 5V 输出、具有软启动功能的 1A 稳压器的典型应用
- DC2324A-A,基于具有同步整流功能的 LT3753 有源钳位正向转换器的演示板
- DC2365A-G,基于 LTC2353-16 缓冲双通道、18 位、550 ksps 同步采样 SAR ADC 的演示板
- AM2G-2405SH30Z 5V 2 瓦 DC-DC 转换器的典型应用
- MC78M05BDTG 5V 电流调节器的典型应用
- LTC1625 的典型应用 - 无 RSENSE 电流模式同步降压型开关稳压器
- NCV33074ADTBR2G 交流/直流接地电流监测器的典型应用
- 用于最后喘息电路的 LT3007ETS8 低压差线性稳压器的典型应用电路