嵌入式的概念和这篇文章的内容都在ppt里面:
链接:
关于嵌入式的基本名词如MCU,ARM,树莓派,安卓,以及嵌入式环境见第一个ppt
下载STM32标准库函数文件(https://www.st.com/content/st_com/en.html )
得到STSW-STM32054ACTIVE
STM32F10x standard peripheral library
stmF10系列的标准函数文件
新建一个stm32f10xTemPro文件夹:
主要有如下几个目录:
打开keil mdk5 ,新建工程,保存到USER里面吧,选择板子为stm32f103R6
然后工程文件就会自动创建了
类似这样把文件添加,添加后是这样的:
关于这个固件库:
注意下面内容:
startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、
配置系统时钟、对用C库函数_main最终去到C的世界
system_stm32f10x.c:把外部时钟HSE=8M,经过PLL倍频为72M。
stm32f10x.h:实现了内核之外的外设的寄存器映射
xxx:GPIO、USRAT、I2C、SPI、FSMC
stm32f10x_xx.c:外设的驱动函数库文件
stm32f10x_xx.h:存放外设的初始化结构体,
外设初始化结构体成员的参数列表,外设固件库函数的声明
CMSIS - Cortex 微控制器软件接口标准
core_cm3.h:实现了内核里面外设的寄存器映射
core_cm3.c:内核外设的驱动固件库
NVIC(嵌套向量中断控制器)、SysTick(系统滴答定时器)
misc.h
misc.c
stm32f10x_conf.h:头文件的头文件
//stm32f10x_usart.h
//stm32f10x_i2c.h
//stm32f10x_spi.h
//stm32f10x_adc.h
//stm32f10x_fsmc.h
......
stm32f10x_it.c
stm32f10x_it.h
中断服务函数你可以随意放在其他的地方,并不是一定要放在stm32f10x_it.c
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>
int main(void)
{
// 来到这里的时候,系统的时钟已经被配置成72M。
}
在“C/C++”选项卡的“Define”文本框中输入
这里就是咱们学习c和c++时候最主要的代码,控制流程敲代码
这里借鉴一下这位老哥总结的:keil中三种编译程序的区别
keil的左上角就是:
下面以点亮一个led灯为例说明联合使用
使用是keil MDK版本,要下载板子使用的包
这里借用这篇文章自助搞完:安装stm32芯片包
然后使用上面的模块,下面来试试点灯
这里我就不具体讲了,以后慢慢学固件库
先试试两个软件的联结
keil main:什么都没做
编译没错误,生成hex文件
这里要注意下,要生成hex文件需要
模板文件:
https://wwi.lanzoup.com/isZ8A07s7mej
打开Proteus 8
proteus中不含stm32f103zet6怎么办?
放好器件
放置电阻
电路中的电源需要到终端列表中查询,点击左侧竖排工具箱中的"终端模式"找到power
连接原理图
STM32F的NRST是异步复位脚。
当NRST输入低电平的时候,MCU处于复位状态,重设所有的内部寄存器,及片内几十KB的SRAM。
当NRST从低电平变高时,PC指针从0地址开始。但是复位的回时候不会将STM32F片内RTC的寄存器以及后备存储器重置,因为它们是用电池通答过专门的VBAT脚供电。STM32中的NRST有施密特功能。大概在输入电压低于1.9V的时候将芯片复位。
因为编译错误,无法选用这个模型,换用stm32f103R6模型
出现这种错误
说明没有配置电源
点击设计design菜单,点击配置供电网Power Rail Configuration
选择名称为GND
把VDDA和VSSA添加到右边
又出现这个问题
参考文章:
proteus仿真出错:VCC and GND nets are connected - check net GND
…
…
…
还有一点要注意,Proteus中电阻的默认阻值是10KΩ,10KΩ的电阻会使LED导通电流很小,LED发光小。
双击电阻或右击电阻在弹出菜单中选中”Edit properties“ 调出电阻属性框,然后将Resjstance数值改小一点,改成200Ω
使用上面的模板文件来建立工程
创建一个BSP文件夹,创建led.h led.c 并添加全局变量
再创建includes.h , vartypes.h在USER文件夹。
添加代码:
//vartypes.h
#ifndef _VARTYPES_H
#define _VARTYPES_H
typedef unsigned char Int08U;
#endif
//includes.h
#include "vartypes.h"
#include "led.h"
//led.h
#include "vartypes.h"
#ifndef _LED_H
#define _LED_H
void LEDInit(void);
void LED(Int08U);
#endif
//led.c
#include "includes.h"
#include "stm32f10x.h"
void LEDInit(void)
{
GPIO_InitTypeDef g;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
g.GPIO_Pin=GPIO_Pin_1;
g.GPIO_Mode=GPIO_Mode_Out_PP;
g.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&g);
}
void LED(Int08U state)
{
if(state==0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
}
//mian.c
#include "includes.h"
#include "stm32f10x.h"
int main(void)
{
//初始化led
LEDInit();
LED(1);
//LOOP
while(1)
{
}
}
编译生成hex文件
当然也可以调整项目编译生成的文件位置到OBJ文件夹
hex文件放入芯片
最后灯亮了,这里不知道咋回事,就不演示了
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_35629971/article/details/125737143
内容来源于网络,如有侵权,请联系作者删除!