一、stm32f103c8t6主要引脚接口
STM32F103C8T6的最小核心板通常包括STM32F103C8T6微控制器芯片及其基本外围电路。以下是一些主要引脚接口的介绍:
-
电源引脚:
VDD:供电电压,通常为3.3V。
VDDA:模拟电源,为ADC和DAC等模拟外设提供电源。
VSSA:模拟地,为模拟外设提供参考地。
VBAT:备份电源,可以在主电源断电时为RTC和备份寄存器供电。
-
晶振和时钟引脚:用于提供稳定的时钟信号
OSC_IN:晶振输入引脚。
OSC_OUT:晶振输出引脚。
OSC32_IN:32.768kHz低速晶振输入,通常用于RTC。
OSC32_OUT:32.768kHz低速晶振输出。
-
NRST(复位)引脚:用于手动复位微控制器。
NRST:复位输入引脚,可以用来手动复位微控制器或通过软件编程复位。
-
SWD/JTAG (调试接口)接口:用于程序的调试和测试。
SWDIO:SWD数据输入/输出引脚。
SWCLK:SWD时钟引脚。
SWO/TRACESWO:SWO或Trace调试数据输出引脚。
JTMS/SWDIO:JTAG模式下的TMS和SWD模式下的数据I/O引脚。
JTCK/SWCLK:JTAG模式下的TCK和SWD模式下的时钟引脚。
-
GPIO(通用输入输出)引脚:该微控制器有多个 GPIO 引脚,可以配置为输入模式、输出模式或复用功能模式。
PA0-PA15、PB0-PB15、PC0-PC15、PD0-PD2:这些GPIO引脚可以配置为输入、输出或具有特定功能的复用模式。例如,PA9和PA10可以复用为USART1的TX和RX。
-
ADC(模数转换器)通道:用于模拟信号的采集。
PA0-PA7、PB0-PB1:这些引脚可以配置为模拟输入,用于ADC(模数转换器)。
-
DAC(数模转换器)通道:用于产生模拟信号。
PA4、PA5:这些引脚可以用作DAC(数模转换器)的输出。
-
USART(通用同步/异步接收/发送器)接口:通常用于与外部设备进行全双工的异步通信。
USART1:TX(PA9),RX(PA10)。
USART2:TX(PA2),RX(PA3)。
USART3:TX(PB10),RX(PB11)。
-
SPI(串行外设接口)接口:用于与外部设备进行高速同步数据通信。
SPI1:SCK(PA5),MISO(PA6),MOSI(PA7)。
SPI2:SCK(PB13),MISO(PB14),MOSI(PB15)。
-
I2C(集成电路间总线)接口:用于连接低速外围设备。
I2C1:SCL(PB6),SDA(PB7)。
I2C2:SCL(PB10),SDA(PB11)。
-
TIM(定时器)接口:提供定时、计数、PWM(脉冲宽度调制)等功能
TIM1:多个通道可用,如CH1(PA8)。
TIM2:多个通道可用,如CH1(PA0),CH2(PA1)。
TIM3:多个通道可用,如CH1(PA6),CH2(PA7)。
-
CAN(控制器局域网络)接口:用于实现高可靠性的网络通信。
CAN1:TX(PB9),RX(PB8)。
二、proteus仿真LED流水灯
Proteus原理图:
仿真结果:
三、LED流水灯
关于GPIOx端口的各寄存器地址和详细参数
STM32F103C8T6微控制器的每个GPIO端口(如GPIOA、GPIOB、GPIOC等)都有一组寄存器用于控制和配置端口的状态。以下是一些主要的寄存器及其地址:
-
端口模式寄存器(GPIOx_CRL, GPIOx_CRH):
地址:GPIOx_BASE + 0x00(对于低寄存器CRL)和GPIOx_BASE + 0x04(对于高寄存器CRH)。
功能:配置每个GPIO引脚的工作模式(输入、输出、复用功能等)和输出类型(推挽或开漏)。
-
端口输出数据寄存器(GPIOx_ODR):
地址:GPIOx_BASE + 0x0C。
功能:存储GPIO端口的输出数据(每个位对应一个引脚)。
-
端口输入数据寄存器(GPIOx_IDR):
地址:GPIOx_BASE + 0x08。
功能:读取GPIO端口的输入数据(每个位对应一个引脚)。
-
端口置位/复位寄存器(GPIOx_BSRR):
地址:GPIOx_BASE + 0x10。
功能:用于原子性地对输出引脚进行置位(置1)或复位(置0)操作。
-
端口配置锁寄存器(GPIOx_LCKR):
地址:GPIOx_BASE + 0x18。
功能:用于锁定GPIO端口的配置,以防止意外更改。
-
备用功能寄存器(GPIOx_AFRL, GPIOx_AFRH):
地址:GPIOx_BASE + 0x20(对于低寄存器AFRL)和GPIOx_BASE + 0x24(对于高寄存器AFRH)。
功能:配置每个GPIO引脚的备用功能(用于复用功能)。
(1)点亮流水灯
程序:
#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);//这个函数在代码中是空的,通常用于系统初始化,包括配置系统时钟、Flash等。
void Delay_ms(volatile unsigned int);//延时函数
//分别用于控制连接到GPIOA、GPIOB、GPIOC的LED灯的亮灭。
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低电平
}
//主函数:
//开启GPIOB、GPIOC、GPIOA的时钟。
//配置GPIOB、GPIOC、GPIOA的相关引脚为推挽输出模式。
//初始化LED灯为不亮状态。
//在一个无限循环中,依次点亮B_LED、C_LED、A_LED,并延时一段时间。
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(1000);
C_LED_LIGHT();
Delay_ms(1000);
A_LED_LIGHT();
Delay_ms(1000);
}
}
void SystemInit(){
}
实验效果:
(2)在流水灯点亮PC13LED
程序:
#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);//这个函数在代码中是空的,通常用于系统初始化,包括配置系统时钟、Flash等。
void Delay_ms(volatile unsigned int);//延时函数
//分别用于控制连接到GPIOA、GPIOB、GPIOC的LED灯的亮灭。
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<<13; //PC13高电平
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x0<<9; //PB9低电平
GPIOC_ODR=0x1<<13; //PC13高电平
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x0<<13; //PC13低电平
}
//主函数:
//开启GPIOB、GPIOC、GPIOA的时钟。
//配置GPIOB、GPIOC、GPIOA的相关引脚为推挽输出模式。
//初始化LED灯为不亮状态。
//在一个无限循环中,依次点亮B_LED、C_LED、A_LED,并延时一段时间。
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 &= 0xff0fffff; //设置位 清零
GPIOC_CRH|=0x00300000; //PC15推挽输出
GPIOA_CRL &= 0xfff0ffff; //设置位 清零
GPIOA_CRL|=0x00010000; //PA4推挽输出
// 3个LED初始化为不亮(即高点位)
GPIOB_ODR |= (1<<9);
GPIOC_ODR |= (1<<13);
GPIOA_ODR |= (1<<4);
while(j){
B_LED_LIGHT();
Delay_ms(2000);//单片机上2000 100
C_LED_LIGHT();
Delay_ms(3000);//单片机上3000 200
A_LED_LIGHT();
Delay_ms(3000);//单片机上3000 200
}
}
void SystemInit(){
}
实验效果:
四、总结
经过这次学习我对stm32f103c8t6的相关知识有了更多了解。