一,使用工具
1.stm32f103C8T6
2.USB转串口
3.面包板
4.导线若干
5.LED3个
二,程序设计思路
这里我们通过GPIO端口来点亮LED灯
首先打开GPIO口的时钟
然后初始化GPIO端口
最后设置低电平
1.关于GPIOx地址
2.时钟的地址
打开GPIO端口的时钟这里我们需要将三个位置全部置1
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
// 打开时钟
RCC_APB2ENR |= (1<<3); // 打开 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 打开 GPIOC 时钟
RCC_APB2ENR |= (1<<2); // 打开 GPIOA 时钟
3.初始化GPIO端口
GPIO端口有八种模式,这里我们使用推挽式输出。
端口1-7为低,端口8-15为高。每个引脚由四个位控制。
以GPIOB和0号引脚(B0)为例,将其设置为推挽输出,并设置最大速度为10MHz,则将控制B0的四个位设置为0001
这里GPIO A,B,C分别对应A0,B0,C15
代码如下:
#define GPIOB_CRL (*(unsigned int *)0x40010C00)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)// 配置 GPIO 口为推免输出
// GPIOB----最后四位为0001
GPIOB_CRL |= (1<<0); // 最后一位变1
GPIOB_CRL &= ~(0xE<<0); // 倒数2、3、4位变0
// GPIOC----前四位为0001
GPIOC_CRH |= (1<<28); // 第四位变1
GPIOC_CRH &= ~(0xE0000000); // 前三位变0
// GPIOA----最后四位为0001
GPIOA_CRL |= (1<<0); // 最后一位变1
GPIOA_CRL &= ~(0xE<<0); // 倒数2、3、4位变0
4.设置低电平
这里GPIO A,B,C分别对应A0,B0,C15
代码如下:
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
GPIOB_ODR &= ~(1<<0); //最后一位变为0
GPIOC_ODR &= ~(1<<15); //倒数16位变为0
GPIOA_ODR &= ~(1<<0); //最后一位变为0
三,创建LED项目
1.新建项目
点击project下的第一个
选择项目路径,创建文件名
这里是LED1.0
然后是选择芯片,这里是STM32F103C8
这里不需要多加设置所以直接关闭
右击文件夹,点击第二个添加新文件
选择.c,文件命名为LEDmain
找到所需要的启动文件
将所需要的启动文件复制到项目目录下(f103c8t6启动文件为startup_stm32f10x_md.s
右击文件夹,选择Add Existing Files to Group Source Group 1(或双击文件夹)
选择All FIles,选择刚刚添加的启动文件,Add,Add之后Close:
点开魔术棒,具体设置如下
2.编写代码
代码如下所示
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRL (*(unsigned int *)0x40010C00)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
int main(){
// 开启时钟
RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
// 设置 GPIO 为推挽输出
// 设置 GPIOB 最后四位为 0001 (B0)
GPIOB_CRL |= (1<<0); // 最后一位设置为1
GPIOB_CRL &= ~(0xE); // 倒数二、三、四位设置为0
// 设置 GPIOC 前四位为 0001 (C15)
GPIOC_CRH |= (1<<28); // 第四位设置为1
GPIOC_CRH &= ~(0xE0000000); // 前三位设置为0
// 设置 GPIOA 最后四位为 0001 (A0)
GPIOA_CRL |= (1<<0); // 最后一位设置为1
GPIOA_CRL &= ~(0xE); // 倒数二、三、四位设置为0
// 3个LED初始化为不亮(即高点位)
GPIOB_ODR |= (1<<0); // 最后一位设置为1
GPIOC_ODR |= (1<<15); // 倒数第15位设置为1
GPIOA_ODR |= (1<<0); // 最后一位设置为1
while(1){
GPIOB_ODR &= ~(1<<0); // 点灯1
Delay_ms(1000000);
GPIOB_ODR |= (1<<0); // 灭灯1
Delay_ms(1000000);
GPIOC_ODR &= ~(1<<15); // 点灯2
Delay_ms(1000000);
GPIOC_ODR |= (1<<15); // 灭灯2
Delay_ms(1000000);
GPIOA_ODR &= ~(1<<0); // 点灯3
Delay_ms(1000000);
GPIOA_ODR |= (1<<0); // 灭灯3
Delay_ms(1000000);
}
}
void SystemInit(){
}
四,连接电路
对于USB转TTL模块和stm32f103c8t6连接
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
总电路如下:
然后编译
连接到电脑,打开flymcu,上传HEX文件到stm32f103c8t6上:
开始编程
成功点亮LED灯
五,总结
学习和理解STM32F103系列芯片的地址映射和寄存器映射原理。
了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。
注意面包板是分块的,不然无法通电。
这个实验进行起来还是比较困难,还需要多加学习。