***********************************************************************************************************************************************************
开发板 :奋斗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灯了
上一篇:STM32中的assert_param函数浅析
下一篇:stm32 bootloader更新固件重启 IWDG独立看门狗
推荐阅读最新更新时间:2024-03-16 16:19