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/
避免重复包含头文件,下次加载头文件时候 因为已经定义过宏所以直接跳过