1、了解stm32f103c8t6最小核心板的主要引脚接口
了解STM32最小系统核心板(STM32F103C8T6,国际上称为 STM32 Blue Bill开发板) 的电路原理图
1 最小系统原理图
最小系统主要有电源,时钟,调试,复位,以及控制芯片五大部分组成。
2 电源系统
由LDO(Low Dropout Regulator)低压差线性稳压器将5V转换为3.3V,为主控芯片供电。
3 时钟电路
晶振是由石英晶体组成的,石英晶体之所以能当为振荡器使用,是基于它的压电效应:在晶片的两个极上加一电场,会使晶体产生机械变形;在石英晶片上加上交变电压,晶体就会产生机械振动,同时机械变形振动又会产生交变电场,虽然这种交变电场的电压极其微弱,但其振动频率是十分稳定的。当外加交变电压的频率与晶片的固有频率(由晶片的尺寸和形状决定)相等时,机械振动的幅度将急剧增加,这种现象称为“压电谐振”。
晶振电路为主控芯片提供系统时钟,所有的外设工作,CPU工作都要基于该时钟,类似于整个系统的“心跳节拍”。
晶振分为无源和有源,但是本质上都是皮尔斯震荡电路(反相放大器+电阻+电容+晶体+电源),只不过对于单片机而言,单片机内部集成了反相放大器和电阻以及电源,外接晶体和电容就可以了,这里的晶体就称之为无源晶振。
而有源晶振是将皮尔斯振荡器作成一个整体,直接加电源即可工作,当然,价格也会比无源的贵一些。
4 复位电路
主控芯片是低电平复位(引脚NRST),硬件按键复位属于系统复位之一(另外还有软件复位,看门狗计数终止复位等)。其中的电容C2的目的是按键消抖,防止在按键刚刚接触/松开时的电平抖动引发误动作(按键闭合/松开的接触过程大约有10ms的抖动,这对于主控芯片I/O控制来说已经是很长的时间,足以执行多次复位动作。由于电容电压不会突变,所以采用电容滤波,防止抖动复位误动作)。
5 调试接口
程序开发的过程中,需要下载bin/hex文件,以及在线仿真调试,可采用SWD或者JTAG的方式。SWD 模式比 JTAG 在高速模式下面更加可靠,且只需4引脚,实际开发中一般都采用SWD方式。其中的时钟线CLK是用于Jlink和芯片的时钟同步,一般频率设置为4MHz,可根据实际情况调整频率。
2、用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
LED流水灯实验代码
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#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 A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ODR=0x0<<4; //PA4???
GPIOB_ODR=0x1<<9; //PB9???
GPIOC_ODR=0x1<<15; //PC15???
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4???
GPIOB_ODR=0x0<<9; //PB9???
GPIOC_ODR=0x1<<15; //PC15???
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4???
GPIOB_ODR=0x1<<9; //PB9???
GPIOC_ODR=0x0<<15; //PC15???
}
int main(){
int j=100;
// ????
RCC_APB2ENR |= (1<<3); // ?? GPIOB ??
RCC_APB2ENR |= (1<<4); // ?? GPIOC ??
RCC_APB2ENR |= (1<<2); // ?? GPIOA ??
// ?? GPIO ?????
GPIOB_CRH&= 0xffffff0f; //??? ??
GPIOB_CRH|=0x00000020; //PB9????
GPIOC_CRH &= 0x0fffffff; //??? ??
GPIOC_CRH|=0x30000000; //PC15????
GPIOA_CRL &= 0xfff0ffff; //??? ??
GPIOA_CRL|=0x00010000; //PA4????
// 3?LED??????(????)
GPIOB_ODR |= (1<<9);
GPIOC_ODR |= (1<<15);
GPIOA_ODR |= (1<<4);
while(j){
B_LED_LIGHT();
Delay_ms(1000000);
C_LED_LIGHT();
Delay_ms(1000000);
A_LED_LIGHT();
Delay_ms(1000000);
}
}
void SystemInit(){
}
LED流水灯实验原理图
仿真运行
3、使用GPIO引脚,外接LED灯,编写程序让LED灯周期性亮灭
以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
实验代码
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
int main()
{
RCC_APB2ENR |=(1<<2);// 打开 GPIOA 时钟,(1<<2)意思是,将1左移两位,然后再与RCC或运算
GPIOA_CRL &=0xfffff000;//端口低配置寄存器
GPIOA_CRL |=0x00000111;
GPIOA_ODR |=0xffffffff;//端口电平设置
while(1)
{
GPIOA_ODR &=0xfffffffe;//将A0口置0,点亮LED
Delay_ms(10000); //延时函数
GPIOA_ODR |=0xffffffff;//又将输出端口全部变为高电平,灭灯
Delay_ms(10000);
GPIOA_ODR &=0xfffffffd;//A1口
Delay_ms(10000);
GPIOA_ODR |=0xffffffff;
Delay_ms(10000);
GPIOA_ODR &=0xfffffffb;//A2口
Delay_ms(10000);
GPIOA_ODR |=0xffffffff;
Delay_ms(10000);
}
}
实验结果
总结
通过这次实验,我了解了stm32f103c8t6最小核心板的主要引脚接口以及逐渐掌握了Keil 开发stm32程序的环境搭建和设置,还学会使用GPIO引脚,外接LED灯,编写程序让LED灯周期性亮灭。