stm32基本外设配置及使用(标准库)

内容:
1、stm32标准库函数开发手册
2、查看工程中用到的函数
3、GPIO等驱动的使用
4、LED配置及使用
5、按键配置及使用
6、外部中断配置及使用
7、串口配置及使用
8、定时器配置及使用

1、stm32标准库函数开发手册
https://download.csdn.net/download/qasxc78563/11456538
在这里插入图片描述2、查看工程中用到的函数
在这里插入图片描述
在这里插入图片描述
3、GPIO等驱动的使用
在这里插入图片描述
4、GPIO配置(LED)使用
1)定义结构体变量
2)初始化硬件时钟
3)对结构体变量的成员配置(引脚、输入/输出模式、输出类型、速度、上下拉电阻)
4)初始化结构体变量,使结构体变量配置信息生效

   // 1)定义结构体变量
   GPIO_InitTypeDef  GPIO_InitStructure;
   // 2)初始化硬件时钟
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	
   /* 3) 初始化 PF9 PF10  */
   GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_9|GPIO_Pin_10
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;              
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;            
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;         
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;           
	//使结构体变量信息生效
   GPIO_Init(GPIOF, &GPIO_InitStructure);
	// LED灯置1灭,置0亮
   GPIO_WriteBit(GPIOF,GPIO_Pin_9,(BitAction)1);
   GPIO_WriteBit(GPIOF,GPIO_Pin_10,(BitAction)1);

5、按键控制

// 定义结构体变量
GPIO_InitTypeDef  GPIO_InitStructure;
/* 使能硬件始时  GPIOE  */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/* 配置 PE2 PE3 PE4 信息 */
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;     //选择引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;               				// 选择输输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                 //上拉
//使配置信息生效
GPIO_Init(GPIOE, &GPIO_InitStructure);

//等待引脚被按细  GPIO-->输入--->按键按下    ---->消抖
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
		delay_ms(10);   //消抖
		if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
		{
				//判断一下灯的状态 
				if(GPIO_ReadOutputDataBit(GPIOF,GPIO_Pin_10)==1)
				{
						GPIO_ResetBits(GPIOF,GPIO_Pin_10);
				}
				else
				{
						GPIO_SetBits(GPIOF,GPIO_Pin_10);
				}
	    }
        //等待按键   松开
		while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);		
}

6、外部中断配置使用
1)定义GPIO结构体变量、EXTI结构体变量、NVIC结构体变量
2)配置GPIO时钟、系统时钟(SYSCFG)
3)配置中断引脚的GPIO信息(引脚、输入模式、上下拉电阻,初始化结构体变量,使结构体变量配置信息生效)
4)将GPIO引脚连接到对应的中断线
5)配置EXTI(中断线)信息(控制线、中断模式、触发方式、启用,初始化结构体变量,使结构体变量配置信息生效)
6)配置中断优先级组
7)中断优先级NVIC设置(中断线通道、抢占优先级、子优先级、IRQ通道被使能、初始化NVIC寄存器)
8)编写中断处理函数
(8.1)检测中断线是否真的被触发
(8.2)中断处理
(8.3)清除中断线的中断标志位

int main(void)
{		
	EXTI_InitTypeDef   EXTI_InitStructure;
	GPIO_InitTypeDef   GPIO_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;
	
	/* 使能 GPIOA 硬件时钟 */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	/* 使能 SYSCFG 硬件时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	
	/* 配置 PA0 输入模式 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/* 将 pa0 链接到 EXTI Line0  */
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
	
	/* 配置外部中断线0  EXTI Line0 */
	EXTI_InitStructure.EXTI_Line = EXTI_Line0;                  //外部中断控制线0
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //以 打断 的方式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;      //以上升沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   //启用
	//使配置信息生效
	EXTI_Init(&EXTI_InitStructure);
	
	//配置 优先级组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //  2    2   00  --11 0-3   0000 
	
	/* 使能并且 配置 EXTI Line0 优先级*/
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                //配置外部中断通断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;    //配置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;            //配置  响应优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
	//使配置信息生效
	NVIC_Init(&NVIC_InitStructure);
	
	led_Init();
	while(1);
}

//中断处理函数
 void EXTI0_IRQHandler(void)
 {
	//检测中断是否真的被触发
   if(EXTI_GetITStatus(EXTI_Line0) != RESET)
   {
     /* Toggle LED1 */
     GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
     
     /* 清除中断标志位 EXTI line 0 */
     EXTI_ClearITPendingBit(EXTI_Line0);
   }
 }

7、串口配置使用
1)定义GPIO结构体变量、USART结构体变量、NVIC结构体变量
2)配置GPIO时钟、USARTx时钟(SYSCFG)
3)配置USARTx的TX和RX引脚的GPIO信息(引脚、模式、输出类型、速度、上下拉电阻,初始化结构体变量,使结构体变量配置信息生效)
4)将GPIO引脚连接到对应的USARTx(GPIO复用)
5)配置USARTx信息(波特率、数据长度、停止位、校验位、硬件流控、串口功能,初始化结构体变量,使结构体变量配置信息生效)
6)配置中断优先级组
7)中断优先级NVIC设置(串口中断通道、抢占优先级、子优先级、IRQ通道被使能、初始化NVIC寄存器)
8)允许串口中断接收数据,启用 USARTx
9)串口中断处理函数的编写
(9.1)检测接收标志位
(9.2)接收数据
(9.3)判断数据是否接收完成
(9.4)清除串口中断

#include "stdio.h"
#include "stm32f4xx.h"
#include "delay.h"
#include "led.h"
#include "string.h"

char RecvDate[20];  //接受完成数据
char Tbuf[20];  //临时存放数据
int Recvflag=0;

void SendString(USART_TypeDef* USARTx, char *dat);
void USART1_Config(int BaudRate);

int main(void)
{

	USART1_Config(9600);
	led_Init();
	while(1)
	{
		//LED1_ON   LED1_OFF
		//判断数据是否== LED1_ON
		if(strncmp(RecvDate,"LED1_ON",7)==0)
		{
			 GPIO_ResetBits(GPIOF, GPIO_Pin_9);
			 SendString(USART1,"LED1_ON\r\n");
			 //清空数组数据
			 memset(RecvDate,0,20);			
		}
		if(strncmp(RecvDate,"LED1_OFF",8)==0)
		{
			 GPIO_SetBits(GPIOF, GPIO_Pin_9);
			 memset(RecvDate,0,20);		
		}			
	}
}

void USART1_Config(int BaudRate)
{
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /*使能 GPIO 时钟*/
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  
  /*使能 USART1 时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  
  /* 将 PA9 PA10 链接 到 USART1 */
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
  
  /* 配置 USART1 Tx(PA9 ) 和 Rx(PA10 ) */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  //配置串口1相关信息 
  USART_InitStructure.USART_BaudRate = BaudRate;                  	//配置波特率 
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;  		//数据长度 
  USART_InitStructure.USART_StopBits = USART_StopBits_1;       		//停止位1 
  USART_InitStructure.USART_Parity = USART_Parity_No;          		//无校验位
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //不需要硬件流控
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //串口功能:接收数据和发送数据
  USART_Init(USART1, &USART_InitStructure);
  
  /* NVIC configuration */
  /* 配置优先级组 两位 抢占,2位 响应 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 使能 USART1 中断*/
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;          //选择串口中断通道1
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 
 // 允许串口中断接收数据 
  USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);
  /*启用 USART1 */
  USART_Cmd(USART1, ENABLE);

}

//串口中断服务函数
 void USART1_IRQHandler(void)
 {	 
   /* 检测接收标志位 */
   if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
   {
       /* 接受数据  固定数据格式    LED1_ON\r\n*/
       Tbuf[Recvflag++]= USART_ReceiveData(USART1); 	   
	   if(Tbuf[Recvflag-1]=='\n' && Tbuf[Recvflag-2]=='\r')
	   {
			//数据接受完成
			memset(RecvDate,0,sizeof(RecvDate));
		    strcpy(RecvDate,Tbuf);
		    Recvflag=0;
		    memset(Tbuf,0,sizeof(Tbuf));		   
	   }
	  USART_ClearITPendingBit(USART1,USART_IT_RXNE);  
   }   
 }

//发送数据到串口
void SendString(USART_TypeDef* USARTx, char *dat)
{
	//判断数据数据 是否是 '\0',是代表发送数据完成
	while(*dat!='\0')
	{
		//检测是否可以发送数据
		while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE));
		//将数据发送过去
		 USART_SendData(USARTx,*dat);
		//让指针指向下一个字符
		 dat++;
	}
}	  

8、定时器配置及使用
1)定义TIM结构体变量、NVIC结构体变量
2)配置TIMx时钟
3)配置TIM结构体信息(自动重装值、时钟预分频数、时钟分割、计数模式、初始化TIMx的时间基数单位)
4)使能指定的TIMx中断,允许更新中断
5)设置NVIC中断分组
6)中断优先级NVIC设置(TIMx中断、抢占优先级、子优先级、IRQ通道被使能、初始化NVIC寄存器)
7)使能TIMx
8)定时器中断服务程序
(8.1)检查TIMx更新中断发生与否
(8.2)中断处理
(8.3)清除TIMx更新中断标志位

void TIM2_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
	
	//定时器TIM2初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

	TIM_Cmd(TIM2, ENABLE);  //使能TIMx					 
}

//定时器2中断服务程序
void TIM2_IRQHandler(void)   //TIM2中断
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM2更新中断发生与否
		{
			TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx更新中断标志 
			GPIO_ToggleBits(GPIOE, GPIO_Pin_14);
		}
}

//定时器2初始化函数调用
TIM2_Int_Init(1999,7199);//10Khz的计数频率,计数到2000为200ms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值