(1)微控制器
STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。
(2)基本参数
类别:集成电路(IC)
家族:嵌入式-微控制器
总线宽度:32-位
速度:72MHz
外围设备:DMA,电机控制PWM,PWM,温度传感器
输入/输出数:37
程序存储器容量:64KB (64K x 8)
程序存储器类型:FLASH
RAM容量:20K x 8
电压-电源(Vcc/Vdd):2 V ~ 3.6 V
模数转换器:A/D 10x12b
振荡器型:内部
(3)引脚图
(4)具体结构
STM32F103C8T6整个系统结构可以分为由ARM公司设计的Cortex-M3内核和ST公司在此基础上优化的总线矩阵、DMA(Direct Memory Access,直接内存读取)、AHB、APB1以及APB2上挂载的外设等两个部分
1、本次实验我们选中GPIO的A、B、C三个端口。
找到使能时钟寄存器映射地址:
A、B、C端口寄存器地址:
2、找到偏移地址和A、B、C端口位置:
3、对应端口时钟代码
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能
1、本实验需要用到A4、B5、C14引脚
采用推挽输出模式,输出模式,最大速度为2MHz
2、配置对应引脚寄存器,基地址+偏移量,代码为
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
3、设置输出模式为推挽输出,输出速度为2Mhz,代码为
GPIOA_CRL&=0xFFF0FFFF; //设置位 清零
GPIOA_CRL|=0x00020000; //PA4推挽输出,把第19、18、17、16位变为0010
GPIOB_CRL&=0xFF0FFFFF; //设置位 清零
GPIOB_CRL|=0x00200000; //PB5推挽输出,把第23、22、21、20变为0010
GPIOC_CRH&=0xFF0FFFFF; //设置位 清零
GPIOC_CRH|=0x00200000; //PC14推挽输出,把第23、22、21、20变为0010
1、创建新文件LSD
2、选择STM32F103C8
点击OK后,Manage Run-Time Environment界面我们选择cancel
3、加入启动代码
将startup_stm32f10x_md.s文件拷贝到LSD文件夹里面
4、加入文件
添加完毕后,在LSD文件下新建两个文件夹分别用于存放不同的文件,以防止混乱
5、将下载的SYSTEM代码复制过来
6、打开keil点击Target1,点击Manage Project Items,添加如下文件
7、在USER下加入一个main.c文件
8、点击魔法棒,选择output选项
然后再点击Listing
9、加入sys、delay、usart的include路径:
这样,一个完整的 STM32F1 开发工程模板下建立好了。接下来我们就可以进行代码下载和仿真调试了。
1、在USER文件下新建两个文件为led.c和led.h
2、led.c内编写程序
#include "led.h"
//初始化 PB1 PC4 PD8为输出口.并使能这三个口的时钟
//LED IO 初始化
void LED_Init(void)
{
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
RCC->APB2ENR|=1<<3; //使能 PORTB 时钟
// RCC->APB2ENR|=1<<4; //使能 PORTC 时钟
// RCC->APB2ENR|=1<<5; //使能 PORTD 时钟
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;//PB.5 推挽输出
GPIOB->ODR|=1<<5; //PB.5 输出高
GPIOB->CRL&=0XFFFFFFF0;
GPIOB->CRL|=0X00000003;//PB.0 推挽输出
GPIOB->ODR|=1<<0; //PB.0 输出高
GPIOA->CRL&=0XFFFFFF0F;
GPIOA->CRL|=0X00000030;//PA.1 推挽输出
GPIOA->ODR|=1<<1; //PA.1 输出高
}
led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PBout(5) // DS0
#define LED1 PBout(0) // DS1
#define LED2 PAout(1) // DS2
void LED_Init(void); //初始化
#endif
main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与 LED 连接的硬件接口
while(1)
{
LED0=0;
LED1=1;
LED2=1;
delay_ms(1000);
LED0=1;
LED1=0;
LED2=1;
delay_ms(1000);
LED0=1;
LED1=1;
LED2=0;
delay_ms(1000);
}
}
3、点击编译
本次实验使我更熟练的使用keil软件进行编程,以及代码的烧录,STN32接口之间的关系。面包板相比于传统焊接更加方便节省时间。
https://blog.csdn.net/qq_46467126/article/details/120791793?spm=1001.2014.3001.5501