STM32F10X开发 初级学习

STM32F10X开发 初级学习

需要软件Keil5 下载安装相关芯片包(提前准备好固件库包)
烧录软件 例如 FlyMcu.exe

需要startup文件 startup_stm32f10x_hd.s
在这里插入图片描述
所有东西都是开源免费的,可以到ST官网下载。

在这里插入图片描述
有这两个文件就可以简单的操作

在这里插入图片描述
需要一个函数SystemInit(void) ,在这里构建一个空函数,先保证程序正常运行

1.1第一个程序:点亮LED

查找开发板的原理图找到LED对应的引脚,比如LED_G对应PB0
对地址的操作可以查找STM32F10x-参考手册

查找STM32F10x-参考手册和原理图:
LED_G连接在PB0,PB0再APB2总线上

在这里插入图片描述
在这里插入图片描述

1.2第一步是设置时钟RCC

找到控制GPIOB的时钟,首先找到RCC的基地址

在这里插入图片描述

找到RCC中控制GPIOB的端口
在这里插入图片描述

RCC 基地址是0X4002 1000 RCC_APB2ENR 偏移地址为0x18
所以RCC_APB2ENR的地址是0x4002 1018而且第三位是控制IOPB的

1.3第二步找到GPIOB的IO口位输出

查找到GPIOB的基地址位 0X4001 0C00
找到端口配置低寄存器(低八位 CRL 高八位CRH,PB0在前八位,所以需要控制GPIOB_CRL)

在这里插入图片描述

0 1 2 3四位控制PB0的工作模式
将0 1位设置成10MHZ的工作方式
2 3位设置成推挽输出模式

1.4第三步控制ODR寄存器输出

第一个极为PB0
在这里插入图片描述
控制PB0 置为0(LEG低电平点亮)

main.c程序实例:


int main(void){
	//打开GPIOB端口的时钟
	*(unsigned int*)(0x40021018) |= ((1)<<3);
	
	//点亮LED_G
	//配置IO口位输出
	*(unsigned int *)0x40010C00 |= ~((1)<<(4*0));
	//控制ODR寄存器
	*(unsigned int *)0x40010C0C &= ~(1<<0);
	
		//置1         |=       ,    清0  &=~
	
	
	//尝试:
	//1.点亮其他两个LED等
	//2.建一个简单的延时函数 让灯闪烁
}

void SystemInit(void){

}

2.通过宏定义实现点亮LED的功能

通过查找参考手册 将一些地址定义好,可以直接拿来使用
例如:新建stm32f10x.h 在stm32f10x.h中定义


//外设基地址   APB1的地址
#define PERIPH_BASE		((unsigned int)0x40000000)

//三条总线的地址 APB1  APB2 AHP
#define APB1PERIPH_BASE		PERIPH_BASE
#define APB2PERIPH_BASE 	(PERIPH_BASE + 0X00010000)
#define AHBPERIPH_BASE		(PERIPH_BASE + 0X00018400)

//定义GPIOX_BASE的基地址
#define GPIOA_BASE		(APB2PERIPH_BASE + 0X0800)
#define GPIOB_BASE		(APB2PERIPH_BASE + 0X0C00)
#define GPIOC_BASE		(APB2PERIPH_BASE + 0X1000)
#define GPIOD_BASE		(APB2PERIPH_BASE + 0X1400)
#define GPIOE_BASE		(APB2PERIPH_BASE + 0X1800)
#define GPIOF_BASE		(APB2PERIPH_BASE + 0X1C00)
#define GPIOG_BASE		(APB2PERIPH_BASE + 0X2000)

//寄存器地址 以GPIOB为例
#define GPIOB_CRL 		(GPIOB_BASE + 0X00)
#define GPIOB_CRH 		(GPIOB_BASE + 0X04)
#define GPIOB_IDR 		(GPIOB_BASE + 0X08)
#define GPIOB_ODR 		(GPIOB_BASE + 0X0C)
#define GPIOB_BSRR 		(GPIOB_BASE + 0X10)
#define GPIOB_BRR		(GPIOB_BASE + 0X14)
#define GPIOB_LCKR 		(GPIOB_BASE + 0X18)




#include "stm32f10x.h"

int main(void){

		//打开GPIOB端口的时钟
	RCC_APB2ENR |= ((1)<<3);
	
	//点亮LED_G
	//配置IO口位输出
	GPIOB_CRL |= ~((1)<<(4*0));
	
	//控制ODR寄存器
	GPIOB_ODR &= ~(1<<0);
	

}


void SystemInit(void){

}

3.通过定义结构体进一步简化操作

#ifndef __STM32F10X_H
#define __STM32F10X_H

//用来存放STM32寄存器映射的代码

//外设 perirhral

#define PERIPH_BASE				 				(unsigned int )(0x40000000)
#define APB1PERIPH_BASE						 PERIPH_BASE			
#define APB2PERIPH_BASE						(PERIPH_BASE + 0X10000)
#define AHBPERIPH_BASE						(PERIPH_BASE + 0X20000)                   //从DMA1开始


#define RCC_BASE								  (AHBPERIPH_BASE + 0X1000)
#define GPIOB_BASE                (APB2PERIPH_BASE + 0X0C00)


#define RCC_APB2ENR               * (unsigned int*)(RCC_BASE + 0X18)
	//第一个*号取内容强制转换数据类型  第二个*号是取地址用来进行相应操作


#define GPIOB_CRL                 * (unsigned int*)(GPIOB_BASE + 0X00)
#define GPIOB_CRH                 * (unsigned int*)(GPIOB_BASE + 0X04)
#define GPIOB_IDR                 * (unsigned int*)(GPIOB_BASE + 0X08)
#define GPIOB_ODR                 * (unsigned int*)(GPIOB_BASE + 0X0C)
#define GPIOB_BSRR                * (unsigned int*)(GPIOB_BASE + 0X10)
#define GPIOB_BRR                 * (unsigned int*)(GPIOB_BASE + 0X14)
#define GPIOB_LCKR                 * (unsigned int*)(GPIOB_BASE + 0X18)
	
typedef unsigned int unit32_t;
typedef unsigned short unit16_t;

typedef struct{

	unit32_t CRL;
	unit32_t CRH;
	unit32_t IDP;
	unit32_t ODR;
	unit32_t BSRR;
	unit32_t BRR;
	unit32_t LCKR;
}GPIO_TypeDef;


#define GPIOB ((GPIO_TypeDef*)GPIOB_BASE)


typedef struct{
	unit32_t CR;
	unit32_t CFGR;
	unit32_t CIR;
	unit32_t APB2RSTR;
	unit32_t APB1RSTR;
	unit32_t AHBENR;
	unit32_t APB2ENR;
	unit32_t APB1ENR;
	unit32_t BDCR;
	unit32_t CSR;

}RCC_TypeDef;

#define RCC ((RCC_TypeDef*)RCC_BASE)

#endif /*__STM32F10X_H*/

简化定义过程,方便main函数操作

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
int main(void){

	void GPIO_SetBits(GPIO_TypeDef *GPIOx,unit16_t GPIO_Pin);  //声明一下 方便调用
		//打开GPIOB端口的时钟

	RCC->APB2ENR |=((1)<<3);
	//点亮LED_G
	//配置IO口位输出
	GPIOB->CRH &= ~((0X0F)<<(4*0)); //初始化操作
	GPIOB->CRL |= ~((1)<<(4*0));
	//控制ODR寄存器
	GPIOB->ODR &= ~(1<<0);
}


void SystemInit(void){

}

4.增加枚举定义,实现函数构建,模块化编程

定义新的文件stm32f10x_gpio实现函数构建

开发中常用
#ifndef __STM32F10X_GPIO_H
#define __STM32F10X_GPIO_H
#include “stm32f10x.h”




#endif /__STM32F10X_GPIO_H/
避免重复包含头文件,下次加载头文件时候 因为已经定义过宏所以直接跳过

C 枚举-菜鸟教程

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值