历史上的今天
今天是:2025年07月10日(星期四)
2019年07月10日 | STM32入门之旅(第二天)-------开发环境搭建、库函数使用
2019-07-10 来源:eefocus
一.如何学习STM32
学好STM32的编程,学好它提供好的库函数就可以了。ST公司会提供STM32的所有库函数的源码与使用手册!
1)C语言
2)阅读库函数与帮助文档,告诉函数的调用次序,详细实现的功能。
3)使用Keil工具,集合可视化编写代码、编译代码、下载运行、程序仿真用于跟踪代码。
4)熟悉外围设备使用,阅读时序图、英文文档
二、搭建ARM Cortex-M4的开发环境
1、安装Keil公司第五代软件开发板平台,Keil 5 或 MDK 5,版本MDK5.14,可以编写代码、编译代码、下载程序。
a.安装mdk514.exe
b.看情况是否去破解软件
1)如果当前编译的程序小于32KB,可以不用破解软件。如果大于32KB,就得破解该软件。
2)如果用于商业用途,最好是购买它的正版授权。
2.安装芯片资料包,包含芯片的函数库来驱动其硬件,相关的例子文档,芯片资料包是由芯片公司编写好之后上传给Keil公司,然后分发下载。
a.下载网址 http://www.keil.com/dd2/pack
三、创建工程
1、创建完工程之后,会出现编译警告出错问题,解决方法可以参考以下注释,因此新建工程后,必须在工程选项卡当中,【C/C++】中的全局宏定义添加"USE_STDPERIPH_DRIVER",即这个定义控制了是否在应用中启用外设驱动。我们使用标准外设库本来就为了方便控制外设,所以要添加这个定义,以启用外设驱动。
2、添加头文件路径,在工程选项卡当中,【C/C++】中的“Include Paths”添加相应的头文件路径,否则这些文件会出现感叹号,编译器说找不到。.RTEDeviceSTM32F407ZE;.RTE
上述包含两个头文件路径,不同的头文件路径以分号进行隔离。
设置成功之后,记得要删除工程目录下的Listings与Objects文件夹,最后进行重新编译。
3、编译的时候,总是出现以下警告,
main.c(8): warning: #1-D: last line of file ends without a newline //文件末尾没有新行
解决方法:每个公司都有自己的编写代码规范,都需要看到回车换行,在文件末尾按一下回车键。
4、设置Keil编译完之后,生成Hex文件。
在工程选项【output】的标签,勾选“Create HEX File”。
重新编译之后,就生成一下信息。
Build target 'led'
FromELF: creating hex file...
.Objectsproject.axf" - 0 Error(s), 0 Warning(s).
四、GPIO的库函数
GPIO:通用的输入输出口
GPIOA:GPIO的A端口
GPIOG:GPIO的G端口
高电平:3.3v电压
低电平:0V电压
STM32库函数的代码规范
硬件名称(大写)_功能
GPIO_SetBits
RCC_AHB1PeriphResetCmd
P(PORT)A0:GPIO端口A的第0个引脚
PA1:GPIO端口A的第1个引脚
PB0:GPIO端口B的第0个引脚
五、通过J-Link仿真下载器进行下载代码
1)J-Link正确连接到开发板
2)安装驱动Setup_JLinkARM_V415e.exe
3)在工程选项的【Debug】标签,选中“J-LINK/J-TRACE Cortex”,接着点击“settings”,设置port为“sw”,频率为“5MHz”;然后点击【Flash Download】,勾选“Reset and Run”。最后点击“确定”按钮退出。
4)在Keil5 界面当中,点击“Download”图标,就可以进行程序下载。
六、使用库函数编程技巧
1、阅读硬件原理图《GEC-M4原理图2016-07-29.pdf》,了解当前需要使用STM32芯片哪个硬件,就可以知道使用哪些库函数接口。
2、使用库函数的时候,只需要了解该函数的使用方法,如传入参数、返回值、功能描述就足矣。库函数里面的编写内容不需要了解,这些代码都是由ST公司去实现的。
3、如何使用库函数实现一个具体的功能,ST公司都会提供例子文档,告诉我们库函数如何使用,无论是新手还是老手都要看的。
.STM32F4xx中文参考手册.pdf
.stm32f4xx_dsp_stdperiph_lib_um.chm
4.使用的编程标准C,也就是ANSI C编程。
#include "stm32f4xx.h"
#include "sys.h"#
#include "delay.h"
static GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{
/* GPIOG Peripheral clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
/* Configure PG6 and PG8 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //设置第几引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //设置引脚为输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引脚翻转频率为100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //引脚浮空
GPIO_Init(GPIOF, &GPIO_InitStructure);
//GPIO_SetBits(GPIOF, GPIO_Pin_9 );
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); /* Configure PG6 and PG8 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 ;
GPIO_Init(GPIOE, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4 ;
GPIO_Init(GPIOE, &GPIO_InitStructure);
while(1)
{
PEout(13) = 1;
PEout(14) = 1;
PFout(9) = 1;
PFout(10) = 1;
delay();
if(PAin(0) == 0)
{
PFout(9) = 0;
delay();
PFout(9) = 1;
}
if(PEin(2) == 0)
{
PFout(10) = 0;
delay();
PFout(10) = 1;
}
if(PEin(3) == 0)
{
PEout(13) = 0;
delay();
PEout(13) = 1;
}
if(PEin(4) == 0)
{
PEout(14) = 0;
delay();
PEout(14) = 1;
}
}
return 0;
}
史海拾趣
|
射频识别是一种非接触的自动识别新技术,它成功地实现了多目标的跟踪与识别,以非接触性、识别速度快、可以多卡识别等优于其他自动识别技术的特性受到广泛重视。 近年来,超高频频段射频识别系统应用的要求推动了超高频读写器和电子标签的研究和开 ...… 查看全部问答> |
|
随着时代的发展,以及用户对安全防范要求的日益提高,监控光端机在安防领域得到越来越广泛的运用,视频监控已成为一种普通的需求。下面就视频监控系统的构建和未来发展趋势展开探讨。互联网技术及应用的飞速发展影响到了视频监控领域,利用廉价的IP ...… 查看全部问答> |
|
产品规格: 1. 处理器与内存 ? CPU:S3C6410,主频667M ? RAM:128M ? FLASH:1Gbit ? MicroSD卡 ...… 查看全部问答> |
|
本人有一套cadence(allegro)使用教程共7CD,包括cadence破解软件和内部视频讲义,(网上是下不来的,就是有也不完全)这份讲义很经典,声音和画面都非常清晰,是初学者不可多得的教程,您如果觉得看书比较慢和比较痛苦就看看视频教程吧,相信您能得 ...… 查看全部问答> |
|
为什么我的程序在运行后,我查看寄存器的值都是0啊,看不到变化。 比如我查看寄存器PE_ODR的值,程序暂停后,我watch寄存器PE_ODR的值总是为0x00,而实际上我用示波器测的话,是0xaa,跟我设定的一样。 我想问一下,是不是用SWIM接口,只能 ...… 查看全部问答> |
|
#include \"hw_types.h\"#include \"hw_memmap.h\"#include \"hw_ints.h\"#include \"hw_gpio.h\"#include \"hw_pwm.h\"#include \ ...… 查看全部问答> |




