STM32–基本知识点

GPIO端口模式

(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出

STM32F10C8T6 引脚分布功能图




STM32F10C8T6 串口分布

串口 1
PA9  /USART1 _TX/TIM1_ _CH2 
PA10 /USART1_ RX/TIM1_ _CH3 ;

串口 2
PA2  /USART2_ TX/ ADC_ IN2/TIM2_ CH3
PA3  /USART2_ RX/ADC_ IN3/TIM2_ _CH4

串口 3 

21 PB10 /12C2 SCL 1 USART3_ TX
22 PB11 / 12C2_ SDA /USART3 _RX

学习案例

STM32固件库使用(GPIO端口控制LED)

led.c

#include"led.h"

void LED_GPIO_Config(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;             //定义结构体指针变量 
	    RCC_APB2PeriphClockCmd(LED1_GPIO_CLK,ENABLE);  
     //配置时钟RCC_APB2PeriphClock寄存器
    /*配置GPIO端口的模式 { 1.选择要控制的GPIO引脚 2.设置引脚模式(通用推挽输出) 3.设置引脚速率 }*/
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	  GPIO_InitStructure.GPIO_Pin   = LED1_GPIO_PIN;	//red
	  GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);	//调用GPIO库函数,初始化GPIO端口
	  
	  GPIO_InitStructure.GPIO_Pin   = LED2_GPIO_PIN;	//blue
	  GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);	//调用GPIO库函数,初始化GPIO端口
	  
	  GPIO_InitStructure.GPIO_Pin   = LED3_GPIO_PIN;	//green
	  GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);	//调用GPIO库函数,初始化GPIO端口

led.h

#ifndef __LED_H
#define __LED_H

#include"stm32f10x.h"
/* 注意:该引脚定义是根据野火STM32F103霸道开发板的原理图定义的,如果需要自行的设计需要重新更改宏定义选择不同的GPIO端口 STM32F103ZET6芯片共有144个引脚 其中:GPIOA,GPIOB,GPIOC,GPIOD,GPIOE */

/*red*/

#define LED1_GPIO_PORT GPIOB /* GPIO端口 */
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED1_GPIO_PIN GPIO_Pin_5 /* 连接到SCL时钟线的GPIO */

/*blue*/

#define LED2_GPIO_PORT GPIOB /* GPIO端口 */
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED2_GPIO_PIN GPIO_Pin_1 /* 连接到SCL时钟线的GPIO */

/*green*/

#define LED3_GPIO_PORT GPIOB /* GPIO端口 */
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED3_GPIO_PIN GPIO_Pin_0 /* 连接到SCL时钟线的GPIO */


#define ON 0
#define OFF 1

/* 使用标准的固件库控制IO*/
#define LED1(a) if (a) \ GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\ else \ GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)

#define LED2(a) if (a) \ GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\ else \ GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)

#define LED3(a) if (a) \ GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\ else \ GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)


/* 直接操作寄存器的方法控制IO */
#define digitalHi(p,i) {p->BSRR=i;} //输出为高电平 
#define digitalLo(p,i) {p->BRR=i;} //输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态


/* 定义控制IO的宏 */
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)

#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)

#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)

/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */

//红
#define LED_RED \ LED1_ON;\ LED2_OFF\ LED3_OFF

//绿
#define LED_GREEN \ LED1_OFF;\ LED2_ON\ LED3_OFF

//蓝
#define LED_BLUE \ LED1_OFF;\ LED2_OFF\ LED3_ON

					
//黄(红+绿) 
#define LED_YELLOW \ LED1_ON;\ LED2_ON\ LED3_OFF
//紫(红+蓝)
#define LED_PURPLE \ LED1_ON;\ LED2_OFF\ LED3_ON

//青(绿+蓝)
#define LED_CYAN \ LED1_OFF;\ LED2_ON\ LED3_ON
					
//白(红+绿+蓝)
#define LED_WHITE \ LED1_ON;\ LED2_ON\ LED3_ON
					
//黑(全部关闭)
#define LED_RGBOFF \ LED1_OFF;\ LED2_OFF\ LED3_OFF

void LED_GPIO_Config(void);

#endif

main.c

#include "stm32f10x.h" 
#include "led.h"

int main(void)
{
	// 来到这里的时候,系统的时钟已经被配置成72M。
		LED_GPIO_Config();
		while(1)
		{
			    //red
			     GPIO_ResetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//开
			     DELAY_nMS(2000);
			 GPIO_SetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//关
			 DELAY_nMS(2000);
			 // blue
			 GPIO_ResetBits(LED2_GPIO_PORT , LED2_GPIO_PIN);//开
			 DELAY_nMS(1000);
			 GPIO_SetBits(LED2_GPIO_PORT , LED2_GPIO_PIN);//关
			 DELAY_nMS(1000);
			 //green 
			 GPIO_ResetBits(LED3_GPIO_PORT , LED3_GPIO_PIN);//开
			 DELAY_nMS(3000);
			 GPIO_SetBits(LED3_GPIO_PORT , LED3_GPIO_PIN);//关
			 DELAY_nMS(3000);	
		}	
}

软件延迟函数

delay.c

#include"DELAY.H" 

void DELAY_nUS(unsigned int Time)
{
	while(--Time);
}
void DELAY_nMS(unsigned int time)
{
  unsigned int  i,j;             
  for(i=0;i<time;i++)    
     for(j=0;j<939;j++); 
}



dely.h

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"

void DELAY_nUS(unsigned int Time);
void DELAY_nMS(unsigned int time);

#endif

STM32 GPIO端口 寄存器点灯

#include"stm32f10x.h"//STM32库文件

/*************************************************** * @file main.c * @author dele * @version V1.0 * @date 2020-01-28 * @brief 测试LED *****************************************************/
/***************************************************** 操作LED时寄存器的步骤 { 1.打开 GPIO 端口的时钟 2.配置IO口 (输出/输入) 3.控制ODR寄存器的高低电平状态 } *****************************************************/
/*函数声明*/
int main(void);
void DELAY_nMS(unsigned int time);
void SystemInit(void);


/***************************************************** 函数名称:main() 函数功能:主函数 *****************************************************/
int main(void)
{	
	while(1)
	{
		// 打开 GPIOB 端口的时钟
		*( unsigned int * )0x40021018 |=  ( (1) << 3 );	
		// 配置IO口为输出
		*( unsigned int * )0x40010C00 |=  ( (1) << (4*0) );
		// 控制 ODR 寄存器
		*( unsigned int * )0x40010C0C &= ~(1<<0);//输出低电平 
		 DELAY_nMS(1000);		
		// 打开 GPIOB 端口的时钟
		*( unsigned int * )0x40021018 |=  ( (1) << 3 );	
		// 配置IO口为输出
		*( unsigned int * )0x40010C00 |=  ( (1) << (4*0) );	
		*( unsigned int * )0x40010C0C |= (1<<0); //输出高电平 
		DELAY_nMS(2000);
	}
}



/********************************************************************** 函数名称:DELAY_nMS() 函数功能:延迟函数(延迟1ms) ***********************************************************************/
void DELAY_nMS(unsigned int time)
{
  unsigned int  i,j;             
  for(i=0;i<time;i++)    
     for(j=0;j<939;j++); 
}

/********************************************************************** 函数名称:SystemInit() 函数功能:系统初始化(从汇编代码进入C程序) ***********************************************************************/
void SystemInit(void)
{
	//骗过编译器
}


注:使用开发板是野火F103ZET6霸道开发板(代码是火哥的例程资料代码)

参考资料

1.野火STM32视频学习https://space.bilibili.com/356820657/
2.野火STM32论坛http://www.firebbs.cn/forum.php
3.野火STM32开源资料http://products.embedfire.com/zh_CN/latest/