功能
- 点亮LED灯实验
- 中断实验
- 串口实验
一、点亮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