STM32基础知识学习

功能

  1. 点亮LED灯实验
  2. 中断实验
  3. 串口实验

一、点亮LED灯

bsp_led.h

#ifndef __BSP_LED_H
#define __BSP_LED_H
/******************************* 引入头文件 start *********************************/
#include "sys.h"
#include "stm32f4xx.h"
/******************************** 引入头文件 end *********************************/

/******************************** 宏定义 start **********************************/
#define LED0 			PFout(9)					// DS0
#define LED1 			PFout(10)					// DS1	 
#define LED0_TOGGLE 	GPIOF->ODR ^= GPIO_Pin_9;	//反转
/******************************** 宏定义 start **********************************/

/******************************* 函数声明 start *********************************/
void LED_Init(void);								//LED灯初始化	 
/******************************* 函数声明 start *********************************/
#endif

bsp_led.c

#include "bsp_led.h" 
/**************************************************************************************
  * name        : void LED_Init(void)
  * Function    : 向发送缓冲区写入一个字节
  * Parameters  : void
  * Returns     : NULL
  * Author      : 那些你很冒险的梦
  * Check       :
  * Date        : 2021/3/20
**************************************************************************************/
void LED_Init(void)
{
    
        	 
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);		//打开时钟
	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_UP;				//上拉
	GPIO_Init(GPIOF, &GPIO_InitStructure);						//将配置的参数写入寄存器
	GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);				//将引脚电平置高
}

二、中断实验

bsp_exti.h

#ifndef __EXTI_H
#define __EXIT_H	 
#include "sys.h"  	

/******************************* 引入头文件 start *********************************/
#include "stm32f4xx.h"
/******************************** 引入头文件 end **********************************/

/******************************** 函数声明 start **********************************/
void EXTIX_Init(void);				//中断配置	 
/********************************* 函数声明 end ***********************************/
#endif

bsp_exti.c

#include "bsp_exti.h"
#include "bsp_delay.h" 
#include "bsp_led.h" 
#include "bsp_key.h"
#include "bsp_beep.h"

/**************************************************************************************
  * name        : void EXTI0_IRQHandler(void)
  * Function    : 中断0请求
  * Parameters  : void
  * Returns     : NULL
  * Author      : 那些你很冒险的梦
  * Check       :
  * Date        : 2021/3/20
**************************************************************************************/
void EXTI0_IRQHandler(void)
{
    
    
	delay_ms(10);							//延时
	if(WK_UP==1)	 
	{
    
    
		BEEP=!BEEP; 						
	}		 
	 EXTI_ClearITPendingBit(EXTI_Line0); 	//清除中断
}	
/**************************************************************************************
  * name        : void EXTI2_IRQHandler(void)
  * Function    : 中断2请求
  * Parameters  : void
  * Returns     : NULL
  * Author      : 那些你很冒险的梦
  * Check       :
  * Date        : 2021/3/20
**************************************************************************************/
void EXTI2_IRQHandler(void)
{
    
    
	delay_ms(10);							//延时
	if(KEY2==0)	  
	{
    
    				 
   LED0=!LED0; 
	}		 
	 EXTI_ClearITPendingBit(EXTI_Line2);	//清除中断
}
/**************************************************************************************
  * name        : void EXTI3_IRQHandler(void)
  * Function    : 中断3请求
  * Parameters  : void
  * Returns     : NULL
  * Author      : 那些你很冒险的梦
  * Check       :
  * Date        : 2021/3/20
**************************************************************************************/
void EXTI3_IRQHandler(void)
{
    
    
	delay_ms(10);							//延时
	if(KEY1==0)	 
	{
    
    
		LED1=!LED1;
	}		 
	 EXTI_ClearITPendingBit(EXTI_Line3);  	//清除中断
}
/**************************************************************************************
  * name        : void EXTI4_IRQHandler(void)
  * Function    : 中断4请求
  * Parameters  : void
  * Returns     : NULL
  * Author      : 那些你很冒险的梦
  * Check       :
  * Date        : 2021/3/20
**************************************************************************************/
void EXTI4_IRQHandler(void)
{
    
    
	delay_ms(10);						//延时
	if(KEY0==0)	 
	{
    
    				 
		LED0=!LED0;	
		LED1=!LED1;	
	}		 
	 EXTI_ClearITPendingBit(EXTI_Line4);//清除中断
}
	   
/**************************************************************************************
  * name        : void EXTIX_Init(void)
  * Function    : 中断配置
  * Parameters  : void
  * Returns     : NULL
  * Author      : 那些你很冒险的梦
  * Check       :
  * Date        : 2021/3/20
**************************************************************************************/
void EXTIX_Init(void)
{
    
    
	NVIC_InitTypeDef   NVIC_InitStructure;
	EXTI_InitTypeDef   EXTI_InitStructure;
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);	//打开GOPO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);						//打开时钟

	/********************************************* 端口配置 start *********************************************/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; 		//GPIO配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;							//输入模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;						//速率
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;							//上拉模式
	GPIO_Init(GPIOE, &GPIO_InitStructure);									//将参数写入寄存器

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;								//GPIO配置
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;							//下拉模式
	GPIO_Init(GPIOA, &GPIO_InitStructure);									//将参数写入寄存器
	/********************************************* 端口配置 start *********************************************/
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

	/********************************************* 中断线 start *********************************************/
	EXTI_InitStructure.EXTI_Line = EXTI_Line0;								//中短线配置
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;						//中断触发
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; 					//上升沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;								//使能中断
	EXTI_Init(&EXTI_InitStructure);											//写入寄存器

	EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line4;	//中短线配置
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;						//中断触发
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 				//上升沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;								//使能中断
	EXTI_Init(&EXTI_InitStructure);											//写入寄存器
	/********************************************** 中断线 end **********************************************/
	
	/*********************************************** 中断配置 ***********************************************/
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;						//中断请求
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;			//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;					//次优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;							//使能
	NVIC_Init(&NVIC_InitStructure);											//将参数写入寄存器

	NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;						//中断请求
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;			//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;					//次优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;							//使能
	NVIC_Init(&NVIC_InitStructure);											//将参数写入寄存器

	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;						//中断请求
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;			//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;					//次优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;							//使能
	NVIC_Init(&NVIC_InitStructure);											//将参数写入寄存器

	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;						//中断请求
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;			//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;					//次优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;							//使能
	NVIC_Init(&NVIC_InitStructure);											//将参数写入寄存器
	/*********************************************** 中断配置 ***********************************************/ 
}

三、串口实验

bsp_usart.h

#ifndef __USART_H
#define __USART_H
#include "stdio.h"	
#include "stm32f4xx_conf.h"
#include "sys.h" 

/********************************* 宏定义  start *********************************/
#define USART_REC_LEN  			200  	
#define EN_USART1_RX 			1		
/********************************* 宏定义  end **********************************/
	 
extern u8  USART_RX_BUF[USART_REC_LEN]; 
extern u16 USART_RX_STA;         		

/******************************* 函数声明  start ********************************/
void uart_init(u32 bound);
/******************************** 函数声明  end *********************************/
#endif

bsp_usart.c

#include "sys.h"
#include "usart.h"	

#if SYSTEM_SUPPORT_OS
#include "includes.h"					
#endif

#if 1
#pragma import(__use_no_semihosting)             
            
struct __FILE 
{
    
     
	int handle; 
}; 

FILE __stdout;       
  
void _sys_exit(int x) 
{
    
     
	x = x; 
} 

int fputc(int ch, FILE *f)
{
    
     	
	while((USART1->SR&0X40)==0);
	USART1->DR = (u8) ch;      
	return ch;
}
#endif
 
#if EN_USART1_RX  
u8 USART_RX_BUF[USART_REC_LEN];    
u16 USART_RX_STA=0;       

/**************************************************************************************
  * name        : void uart_init(u32 bound) 
  * Function    : 串口1初始化
  * Parameters  : bound:波特率 
  * Returns     : NULL
  * Author      : 那些你很冒险的梦
  * Check       :
  * Date        : 2021/3/20
**************************************************************************************/
void uart_init(u32 bound)
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 			//打开GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);			//打开串口时钟
 
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); 	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); 	
	
	//USART1引脚配置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; 		//GPIO引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;					//工作模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;				//速率
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 					
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 					//上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure); 							//写入寄存器

   //USART1 配置
	USART_InitStructure.USART_BaudRate = bound;						//波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;		//数据长度
	USART_InitStructure.USART_StopBits = USART_StopBits_1;			//停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;				//检验位
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//校验位
	USART_Init(USART1, &USART_InitStructure); 						//写入寄存器
	
	USART_Cmd(USART1, ENABLE);  									//串口使能
	
	//USART_ClearFlag(USART1, USART_FLAG_TC);
	
#if EN_USART1_RX	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);					//中断使能
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;				//中断源
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;			//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;				//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;					//使能
	NVIC_Init(&NVIC_InitStructure);									//将参数写入寄存器

#endif
	
}

/**************************************************************************************
  * name        : void USART1_IRQHandler(void)  
  * Function    : 串口1中断
  * Parameters  : void
  * Returns     : NULL
  * Author      : 吴继文
  * Check       :
  * Date        : 2021/3/20
**************************************************************************************/
void USART1_IRQHandler(void)                	
{
    
    
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
	{
    
    
		Res =USART_ReceiveData(USART1);
		
		if((USART_RX_STA&0x8000)==0)
		{
    
    
			if(USART_RX_STA&0x4000)
			{
    
    
				if(Res!=0x0a)USART_RX_STA=0;
				else USART_RX_STA|=0x8000;	
			}
			else 
			{
    
    	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
				{
    
    
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
				}		 
			}
		}   		 
  	} 
} 
#endif	

 




猜你喜欢

转载自blog.csdn.net/qq_37120496/article/details/115178334