历史上的今天
今天是:2024年12月11日(星期三)
2018年12月11日 | STM32_入门程序LED
2018-12-11 来源:eefocus
***********************************************************************************************************************************************************
开发板 :奋斗STM32
cpu :STM32F103
开发环境:keil uVsion4
*************************************************************************************************************************************************************
前言:搞了两天,终于把开发环境搭建好了,以及编写了32的第一个入门程序,我们知道玩一个单片机开发板,做的第一件事就是点亮LED灯,因为之前玩过arm开发板,所以学习STM32也是按照这个思路进行的!因为网上有大量的参考资料感觉学习过程还是蛮顺利的!学习32有库开发和寄存器开发,因为库开发比较高效,所以
接下来的STM32学习之路都是按照库开发模式进行学习!
前期准备:
1. MDK安装(mkd453)
2.J-LINK下载安装(Setup_JLinkARM_V410i.exe)
3.J-LINK线 或 串口线(下载程序到开发板)
一.新建工程
(1)点击project->NEW uVision Project新建工程文件,文件名字任意取,将文件保存在我们自己设定的路径下。
(2)接下来的窗口是选择公司和芯片型号,我用的是ST公司的STM32F103VE,所以选择STM32F103VE,再点击OK。
( 3 ) 接下来问是否启动代码到工程文件,这里我是用的ST的库,则点击“否” (一般情况都是点击“否”)。
(4)此时工程创建成功,但是我们的工程没有任何文件接下来手动添加所需文件。
(5)将官方STM32官方库拷到我们设定的路径下的文件夹新建5个文件夹,USER,FWlib,CMSIS,Output,Listing
*FWlib放\Libraries\STM32F10x_StdPeriph_Driver文件夹下的inc和src文件夹
*USER放main.c stm32f10x_conf.h,stm32f10x_it.h和stm32f10x_it.c
*CMSIS放\Libraries\CMSIS\CM3下的全部文件夹,
(6)回到工程中。在Target下选择ADD Group新建STARTCODE, USER, FElib, CMSIS,里面要放的的代码如图所示:

(7)设置参数output,Listing,c/c++,Debug,Utilities
( 8 ) Jlink下载设置
二,编写main.c
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;
#define LED2_ON GPIO_SetBits(GPIOD,GPIO_Pin_3)
#define LED2_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_3)
void RCC_Configuration(void);
void LED_Config(void);
void Delay(__IO uint32_t nCount);
void LED_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
int main(void)
{
RCC_Configuration();
LED_Config();
while(1)
{
LED2_ON;
Delay(0xAFFFF);
LED2_OFF;
Delay(0xAFFFF);
}
}
void Delay(__IO uint32_t ncount)
{
for(;ncount != 0;ncount--);
}
void RCC_Configuration(void)
{
SystemInit();
}
三.主程序编译连接调试
四.使用J-link下载到开发板上运行
点击“LOAD”

发现开发板上的LED灯成功闪烁。。。
五.main.c编程分析
首先我们我们想编程实现点亮LED,分为这么几步:
1.初始化结构体—GPIO_InitTypeDef类型
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
2.初始化库函数—GPIO_Init()
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
/*---------------------------- GPIO Mode Configuration -----------------------*/
currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
{
/* Check the parameters */
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
/* Output mode */
currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
}
......
}
3.开启外设时钟
GPIO所使用的时钟PCLK2采用默认值,为72MHz,为了使能GPIOD引脚,通常我们是调用RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE)函数,如果想同时使能其他gpio引脚,就改函数的参数为相应的引脚。
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->APB2ENR |= RCC_APB2Periph;
}
else
{
RCC->APB2ENR &= ~RCC_APB2Periph;
}
}
**************************************************************************************************************************************************
说明:开启外设时钟之前首先要配置好系统时钟SYSCLK,为配置好SYSCLK,要设置一系列的时钟来源,倍频,分频等控制参数,这些工作由SystemInit()库函数完成。当芯片被复位(包括上电复位)时,将开始运行startup_stm32f10x_hd.s汇编代码,这个汇编代码先是调用SystemInit(),在进入C语言中的“__main”函数执行,这是一个C标准库的初始化函数,执行这个函数之后最终跳转到用户文件中的“main”函数接口,开始运行主程序。
***************************************************************************************************************************************************
4.控制I/O输出高,低电平
(1)调用GPIO_SetBits()函数控制输出高电平。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BSRR = GPIO_Pin;
}
(2)调用GPIO_ResetBits()函数控制输出低电平。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BRR = GPIO_Pin;
}
5.填充GPIO_InitTypeDef结构体
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
当然这要参考stm32开发板原理图:

根据这个原理图我们就可以改LED_Config(void),GPIO_SetBits(),GPIO_ResetBits()三个函数的配置!然后就可以点亮三个led灯了
史海拾趣
|
信息技术是历史上最与众不同的技术,还有哪一个行业的技术能像它这样如此迅速和广泛地改变了整个世界?根本找不到,尤其当你想到无线电话和互联网连接的时候。在跨越新千年的这十年中,使用这些服务的人数正以令人目瞪口呆的速度迅猛增长。 … 查看全部问答> |
|
下面的if语句显然不能实现数据类型转换器的功能.我想采用if语句实现数据类型转换器的功能,将输入的四位2进制数s4,s3, s2,s1转换为整数sel,应该怎么实现呢??? ENTITY mux41 IS &n ...… 查看全部问答> |
|
正在写一个SIP的程序。 遇到了这样一个困难。 首先在生成SIP软面板的时候,创建了一个窗口,得到句柄hwndsip。 我可以在这个面板上直接TextOut就输出了文本,直接InvalidateRect就可以将文本清除掉,在同一窗口下做这样的一系列操作都没什么问题 ...… 查看全部问答> |
|
由于刚学,可能提的问题不是太有价值,但突然想到,困惑很长时间。我们现在做单片机实验,流程是这样:先在IDE里用汇编写出了源程序,然后编译成*.HEX,然后调试状态全速运行,如果对的话就能看结果了。我有点晕,这源文件变成1 0后怎样变成高低电 ...… 查看全部问答> |
|
主要是如何初始化那个微端口驱动程序,具体操作是什么?我的PC安装了EVC 4SP4和PB 5.0,还需要怎么做才能开发NDIS网络驱动? 这个驱动程序最后是要写入S3C2440开发板上运行的… 查看全部问答> |
|
MR16:在 照明行业里指最大外径为2英寸的带多面反射罩的灯具,MR 是英文 Multifaceted (Mirror)Reflector 的缩写,意思是一种由多个反射面组合成的反射器,数字表示灯泡最大外形的尺寸,为1/8英寸的倍数。所以“16”就表示灯具的最大外径尺寸 ...… 查看全部问答> |
|
本应用指南首先介绍了通过动态重配置端口 (DRP) 对Spartan-6 FPGA 锁相环(PLL) 的时钟输出频率、相移及占空比进行动态修改的方法。在阐述了内部DRP 控制寄存器的功能后,提供了一个通过状 ...… 查看全部问答> |
|
最近在做uC-TCP/IP在基于uCOS-II的TMS320F28335 DSP上的移植,有些疑问,不知道论坛里是否有人做过类似的移植,一起交流交流。… 查看全部问答> |




