一,使用工具
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);
RCC_APB2ENR |= (1<<4);
RCC_APB2ENR |= (1<<2);
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)
GPIOB_CRL |= (1<<0);
GPIOB_CRL &= ~(0xE<<0);
GPIOC_CRH |= (1<<28);
GPIOC_CRH &= ~(0xE0000000);
GPIOA_CRL |= (1<<0);
GPIOA_CRL &= ~(0xE<<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);
GPIOC_ODR &= ~(1<<15);
GPIOA_ODR &= ~(1<<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);
RCC_APB2ENR |= (1<<4);
RCC_APB2ENR |= (1<<2);
GPIOB_CRL |= (1<<0);
GPIOB_CRL &= ~(0xE);
GPIOC_CRH |= (1<<28);
GPIOC_CRH &= ~(0xE0000000);
GPIOA_CRL |= (1<<0);
GPIOA_CRL &= ~(0xE);
GPIOB_ODR |= (1<<0);
GPIOC_ODR |= (1<<15);
GPIOA_ODR |= (1<<0);
while(1){
GPIOB_ODR &= ~(1<<0);
Delay_ms(1000000);
GPIOB_ODR |= (1<<0);
Delay_ms(1000000);
GPIOC_ODR &= ~(1<<15);
Delay_ms(1000000);
GPIOC_ODR |= (1<<15);
Delay_ms(1000000);
GPIOA_ODR &= ~(1<<0);
Delay_ms(1000000);
GPIOA_ODR |= (1<<0);
Delay_ms(1000000);
}
}
void SystemInit(){
}
四,连接电路
对于USB转TTL模块和stm32f103c8t6连接 GND — GND 3v3 — 3v3 TXD — A10 RXD — A9 总电路如下: 然后编译
连接到电脑,打开flymcu,上传HEX文件到stm32f103c8t6上: 开始编程 成功点亮LED灯
五,总结
学习和理解STM32F103系列芯片的地址映射和寄存器映射原理。 了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。 注意面包板是分块的,不然无法通电。 这个实验进行起来还是比较困难,还需要多加学习。
|