first commit
This commit is contained in:
125
Bsp/Inc/Bsp.h
Normal file
125
Bsp/Inc/Bsp.h
Normal file
@@ -0,0 +1,125 @@
|
||||
#ifndef __BSP_H__
|
||||
#define __BSP_H__
|
||||
|
||||
/* BSP INCLUDE */
|
||||
#include "Board.h"
|
||||
/* STDC INCLUDE */
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
/* MCU INCLUDE */
|
||||
#include <stm32f10x.h>
|
||||
#include "stm32f10x_conf.h"
|
||||
|
||||
//SystemInit
|
||||
void BspConfigInit(void);
|
||||
|
||||
//GPIO
|
||||
#define IO_TYPE_DO 0
|
||||
#define IO_TYPE_DI 1
|
||||
#define IO_TYPE_AO 2
|
||||
#define IO_TYPE_AI 3
|
||||
#define IO_TYPE_LED 4
|
||||
typedef enum {
|
||||
false = 0,
|
||||
true = 1,
|
||||
} bool_t;
|
||||
typedef struct
|
||||
{
|
||||
GPIO_TypeDef* GpioX;
|
||||
uint16_t GpioPinX;
|
||||
}GPIO_LIST;
|
||||
void BspInitGpioClock(void);
|
||||
void GpioConfig(GPIO_TypeDef* GpioX, uint16_t GpioPinX, GPIOMode_TypeDef GpioMode, GPIOSpeed_TypeDef GpioSpeed);
|
||||
void SetGpioSts(GPIO_TypeDef* GpioX, uint16_t GpioPinX, bool_t state);
|
||||
bool_t GetGpioSts(GPIO_TypeDef *GpioX, uint16_t GpioPinX);
|
||||
|
||||
//Delay
|
||||
void DelayConfig(void);
|
||||
uint32_t GetDwtCnt(void);
|
||||
void DelayUs(uint32_t Us);
|
||||
void DelayMs(uint32_t Ms);
|
||||
|
||||
//Interrupt
|
||||
#define INTERRUPT_NUM 300
|
||||
typedef struct
|
||||
{
|
||||
void(*CallBack)(uint32_t); //回调函数
|
||||
int32_t IntId; //触发中断的外设id
|
||||
} INT_DESC;
|
||||
typedef struct
|
||||
{
|
||||
INT_DESC Adc_1_2;
|
||||
INT_DESC Usb_Hp_Can1_Tx;
|
||||
INT_DESC Usb_Hp_Can1_Rx0;
|
||||
INT_DESC Can1_Rx1;
|
||||
INT_DESC Can1_Sce;
|
||||
INT_DESC Exti_9_5;
|
||||
INT_DESC Tim_1_Brk;
|
||||
INT_DESC Tim_1_Up;
|
||||
INT_DESC Tim_1_Trg_Com;
|
||||
INT_DESC Tim_1_Cc;
|
||||
INT_DESC Tim_2;
|
||||
INT_DESC Tim_3;
|
||||
INT_DESC Tim_4;
|
||||
INT_DESC I2c_1_Ev;
|
||||
INT_DESC I2c_1_ER;
|
||||
INT_DESC I2c_2_Ev;
|
||||
INT_DESC I2c_2_ER;
|
||||
INT_DESC Spi_1;
|
||||
INT_DESC Spi_2;
|
||||
INT_DESC Usart1;
|
||||
INT_DESC Usart2;
|
||||
INT_DESC Usart3;
|
||||
INT_DESC Exti_15_10;
|
||||
INT_DESC Rtc_Alarm;
|
||||
INT_DESC Usb_WackUp;
|
||||
INT_DESC Tim_8_Brk;
|
||||
INT_DESC Tim_8_Up;
|
||||
INT_DESC Tim_8_Trg_Com;
|
||||
INT_DESC Tim_8_Cc;
|
||||
INT_DESC Adc_3;
|
||||
INT_DESC Fsmc;
|
||||
INT_DESC Sdio;
|
||||
INT_DESC Tim_5;
|
||||
INT_DESC Spi_3;
|
||||
INT_DESC Uart4;
|
||||
INT_DESC Uart5;
|
||||
INT_DESC Tim_6;
|
||||
INT_DESC Tim_7;
|
||||
INT_DESC Dma_2_Chnl_1;
|
||||
INT_DESC Dma_2_Chnl_2;
|
||||
INT_DESC Dma_2_Chnl_3;
|
||||
INT_DESC Dma_2_Chnl_4;
|
||||
} SYSTEM_INT_REG;
|
||||
void DisAllowInt(void);
|
||||
void AllowInt(void);
|
||||
void IntCbInit(void);
|
||||
void IntCbReg(uint32_t Vector, void(*Func)(uint32_t));
|
||||
void IntSetLevel(uint32_t Vector, uint8_t NvicPrePriority, uint8_t NvicSubPriority);
|
||||
|
||||
|
||||
//USART
|
||||
#define DataBit_8 USART_WordLength_8b
|
||||
#define DataBit_9 USART_WordLength_9b
|
||||
#define StopBit_1 USART_StopBits_1
|
||||
#define StopBit_0_5 USART_StopBits_0_5
|
||||
#define StopBit_2 USART_StopBits_2
|
||||
#define StopBit_1_5 USART_StopBits_1_5
|
||||
#define Parity_No USART_Parity_No
|
||||
#define Parity_Even USART_Parity_Even
|
||||
#define Parity_Odd USART_Parity_Odd
|
||||
void BspInitUsartClock(void);
|
||||
void UsartStdConfig(uint32_t ComId, uint32_t baud);
|
||||
void UsartAdvConfig(uint32_t ComId, uint32_t baud, uint8_t DataBits, uint8_t StopBits, uint8_t Parity);
|
||||
void UsartSendChar(uint32_t ComId,uint8_t Data);
|
||||
void UsartSendStr(uint32_t ComId,uint8_t* Data, uint64_t Len);
|
||||
uint8_t UsartReceiveChar(uint32_t ComId);
|
||||
|
||||
//用户层接口
|
||||
void IoCtlToggleDo(uint16_t IoChnl);
|
||||
uint32_t IoCtl(uint8_t IoType, uint16_t IoChnl,uint32_t state);
|
||||
void IoCtlLedToggle(uint16_t IoChnl);
|
||||
#endif
|
||||
0
Bsp/Inc/Interrupt.h
Normal file
0
Bsp/Inc/Interrupt.h
Normal file
204
Bsp/Src/Bsp.c
Normal file
204
Bsp/Src/Bsp.c
Normal file
@@ -0,0 +1,204 @@
|
||||
#include "Bsp.h"
|
||||
|
||||
#ifdef USE_DIGITAL_OUTPUT
|
||||
GPIO_LIST GpioOutputList[] =
|
||||
{
|
||||
{GPIOA,GPIO_Pin_0},
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef USE_DIGITAL_INPUT
|
||||
GPIO_LIST GpioInputList[] =
|
||||
{
|
||||
{GPIOA,GPIO_Pin_0},
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef USE_LED
|
||||
GPIO_LIST GpioLedList[] =
|
||||
{
|
||||
{GPIOB,GPIO_Pin_5},
|
||||
{GPIOE,GPIO_Pin_5},
|
||||
};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief BSP的配置和初始化
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void BspConfigInit(void)
|
||||
{
|
||||
//Interrupt
|
||||
IntCbInit();
|
||||
|
||||
//Delay
|
||||
DelayConfig();
|
||||
|
||||
//SystemClock
|
||||
{
|
||||
#ifdef GPIO_ENABLE
|
||||
BspInitGpioClock();
|
||||
#endif
|
||||
#ifdef USART_ENABLE
|
||||
BspInitUsartClock();
|
||||
#endif
|
||||
}
|
||||
|
||||
//GPIO DO DI
|
||||
{
|
||||
//DO
|
||||
#ifdef USE_DIGITAL_OUTPUT
|
||||
for (uint8_t i = 0; i < DO_NUM; i++) {
|
||||
GpioConfig(GpioOutputList[i].GpioX,GpioOutputList[i].GpioPinX,GPIO_Mode_Out_PP,GPIO_Speed_50MHz);
|
||||
SetGpioSts(GpioOutputList[i].GpioX,GpioOutputList[i].GpioPinX,false);
|
||||
}
|
||||
#endif
|
||||
//DI
|
||||
#ifdef USE_DIGITAL_INPUT
|
||||
for (uint8_t i = 0; i < DI_NUM; i++) {
|
||||
GpioConfig(GpioInputList[i].GpioX,GpioInputList[i].GpioPinX,GPIO_Mode_IPU,GPIO_Speed_50MHz);
|
||||
SetGpioSts(GpioInputList[i].GpioX,GpioInputList[i].GpioPinX,false);
|
||||
}
|
||||
#endif
|
||||
//LED
|
||||
#ifdef USE_LED
|
||||
for (uint8_t i = 0; i < LED_NUM; i++) {
|
||||
GpioConfig(GpioLedList[i].GpioX,GpioLedList[i].GpioPinX,GPIO_Mode_Out_PP,GPIO_Speed_50MHz);
|
||||
SetGpioSts(GpioLedList[i].GpioX,GpioLedList[i].GpioPinX,(bool_t)SET);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//USART
|
||||
{
|
||||
//串口的TX引脚需要复用推挽模式,RX引脚需要浮空输入模式
|
||||
#ifdef USE_USART1
|
||||
GpioConfig(COM0_TX_PORT,COM0_TX_PIN,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
|
||||
GpioConfig(COM0_RX_PORT,COM0_RX_PIN,GPIO_Mode_IN_FLOATING,GPIO_Speed_50MHz);
|
||||
#endif
|
||||
#ifdef USE_USART2
|
||||
GpioConfig(COM1_TX_PORT,COM1_TX_PIN,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
|
||||
GpioConfig(COM1_RX_PORT,COM1_RX_PIN,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
|
||||
#endif
|
||||
#ifdef USE_USART3
|
||||
GpioConfig(COM2_TX_PORT,COM2_TX_PIN,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
|
||||
GpioConfig(COM2_RX_PORT,COM2_RX_PIN,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
|
||||
#endif
|
||||
#ifdef USE_USART4
|
||||
GpioConfig(COM3_TX_PORT,COM3_TX_PIN,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
|
||||
GpioConfig(COM3_RX_PORT,COM3_RX_PIN,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
|
||||
#endif
|
||||
#ifdef USE_USART5
|
||||
GpioConfig(COM4_TX_PORT,COM4_TX_PIN,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
|
||||
GpioConfig(COM4_RX_PORT,COM4_RX_PIN,GPIO_Mode_AF_PP,GPIO_Speed_50MHz);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
//用户层接口
|
||||
/**
|
||||
* @brief IO控制
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
uint32_t IoCtl(uint8_t IoType, uint16_t IoChnl,uint32_t state)
|
||||
{
|
||||
switch (IoType) {
|
||||
#ifdef USE_DIGITAL_OUTPUT
|
||||
case IO_TYPE_DO:
|
||||
SetGpioSts(GpioOutputList[IoChnl].GpioX,GpioOutputList[IoChnl].GpioPinX,state);
|
||||
return 0;
|
||||
#endif
|
||||
#ifdef USE_DIGITAL_INPUT
|
||||
case IO_TYPE_DI:
|
||||
return GetGpioSts(GpioInputList[IoChnl].GpioX,GpioInputList[IoChnl].GpioPinX);
|
||||
#endif
|
||||
#ifdef USE_ANALOG_OUTPUT
|
||||
case IO_TYPE_AO:
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_ANALOG_INPUT
|
||||
case IO_TYPE_AI:
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_LED
|
||||
case IO_TYPE_LED:
|
||||
SetGpioSts(GpioLedList[IoChnl].GpioX,GpioLedList[IoChnl].GpioPinX,(bool_t)state);
|
||||
return 0;
|
||||
#endif
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 反转DO口
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void IoCtlToggleDo(uint16_t IoChnl)
|
||||
{
|
||||
#ifdef USE_DIGITAL_OUTPUT
|
||||
if (GetGpioSts(GpioOutputList[IoChnl].GpioX, GpioOutputList[IoChnl].GpioPinX) == 0)
|
||||
{
|
||||
SetGpioSts(GpioOutputList[IoChnl].GpioX,GpioOutputList[IoChnl].GpioPinX,1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetGpioSts(GpioOutputList[IoChnl].GpioX,GpioOutputList[IoChnl].GpioPinX,0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 反转LED口
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void IoCtlLedToggle(uint16_t IoChnl)
|
||||
{
|
||||
#ifdef USE_LED
|
||||
if (GetGpioSts(GpioLedList[IoChnl].GpioX, GpioLedList[IoChnl].GpioPinX) == 0)
|
||||
{
|
||||
SetGpioSts(GpioLedList[IoChnl].GpioX,GpioLedList[IoChnl].GpioPinX,true);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetGpioSts(GpioLedList[IoChnl].GpioX,GpioLedList[IoChnl].GpioPinX,false);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 重写Printf函数
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
#if defined (__GNUC__) || defined (__SEGGER__)
|
||||
#include <SysCall.c>
|
||||
#elif defined(__CC_ARM) || defined(__CLANG_ARM)
|
||||
int fputc(int ch, FILE *f)
|
||||
{
|
||||
UsartSendChar(TTY_COM, ch);
|
||||
return ch;
|
||||
}
|
||||
int fgetc(FILE *f)
|
||||
{
|
||||
uint8_t ch;
|
||||
ch = UsartReceiveChar(TTY_COM);
|
||||
return ch;
|
||||
}
|
||||
#endif
|
||||
64
Bsp/Src/Delay.c
Normal file
64
Bsp/Src/Delay.c
Normal file
@@ -0,0 +1,64 @@
|
||||
#include "Bsp.h"
|
||||
|
||||
#define DEM_CR *(volatile u32 *)0xE000EDFC
|
||||
#define DWT_CR *(volatile u32 *)0xE0001000
|
||||
#define DWT_CYCCNT *(volatile u32 *)0xE0001004
|
||||
|
||||
#define DEM_CR_TRCENA (1 << 24)
|
||||
#define DWT_CR_CYCCNTENA (1 << 0)
|
||||
|
||||
/**
|
||||
* @brief 初始化延时函数
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void DelayConfig(void)
|
||||
{
|
||||
DEM_CR |= DEM_CR_TRCENA;
|
||||
DWT_CR |= DWT_CR_CYCCNTENA;
|
||||
DWT_CYCCNT = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取DWT计数器的值
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
uint32_t GetDwtCnt(void)
|
||||
{
|
||||
return((uint32_t)DWT_CYCCNT);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 微秒级延时函数
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void DelayUs(uint32_t Us)
|
||||
{
|
||||
uint32_t Start = 0,End = 0,Ts = 0;
|
||||
Start = GetDwtCnt();
|
||||
|
||||
Ts = Us * (SystemCoreClock / 1000000U);
|
||||
|
||||
End = Start + Ts;
|
||||
|
||||
while(GetDwtCnt() < End){;}
|
||||
}
|
||||
/**
|
||||
* @brief 毫秒级延时函数
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void DelayMs(uint32_t Ms)
|
||||
{
|
||||
DelayUs(Ms * 1000);
|
||||
}
|
||||
122
Bsp/Src/Gpio.c
Normal file
122
Bsp/Src/Gpio.c
Normal file
@@ -0,0 +1,122 @@
|
||||
#include "Bsp.h"
|
||||
|
||||
/**
|
||||
* @brief 使能GPIO的时钟
|
||||
* @param [in] GPIOx GPIO组
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void GpioClockEnable(uint32_t GpioX, FunctionalState State)
|
||||
{
|
||||
switch (GpioX) {
|
||||
case GPIOA_BASE:
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, State);
|
||||
break;
|
||||
case GPIOB_BASE:
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, State);
|
||||
break;
|
||||
case GPIOC_BASE:
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, State);
|
||||
break;
|
||||
case GPIOD_BASE:
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, State);
|
||||
break;
|
||||
case GPIOE_BASE:
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, State);
|
||||
break;
|
||||
case GPIOF_BASE:
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, State);
|
||||
break;
|
||||
case GPIOG_BASE:
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, State);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化GPIO口外设的时钟
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void BspInitGpioClock(void)
|
||||
{
|
||||
#ifdef USE_GPIOA
|
||||
GpioClockEnable(GPIOA_BASE,ENABLE);
|
||||
#endif
|
||||
|
||||
#ifdef USE_GPIOB
|
||||
GpioClockEnable(GPIOB_BASE,ENABLE);
|
||||
#endif
|
||||
|
||||
#ifdef USE_GPIOC
|
||||
GpioClockEnable(GPIOC_BASE,ENABLE);
|
||||
#endif
|
||||
|
||||
#ifdef USE_GPIOD
|
||||
GpioClockEnable(GPIOD_BASE,ENABLE);
|
||||
#endif
|
||||
|
||||
#ifdef USE_GPIOE
|
||||
GpioClockEnable(GPIOE_BASE,ENABLE);
|
||||
#endif
|
||||
|
||||
#ifdef USE_GPIOF
|
||||
GpioClockEnable(GPIOF_BASE,ENABLE);
|
||||
#endif
|
||||
|
||||
#ifdef USE_GPIOG
|
||||
GpioClockEnable(GPIOG_BASE,ENABLE);
|
||||
#endif
|
||||
}
|
||||
/**
|
||||
* @brief 配置GPIO口
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void GpioConfig(GPIO_TypeDef *GpioX, uint16_t GpioPinX,
|
||||
GPIOMode_TypeDef GpioMode, GPIOSpeed_TypeDef GpioSpeed)
|
||||
{
|
||||
GPIO_InitTypeDef GpioInitSt;
|
||||
|
||||
GpioInitSt.GPIO_Pin = GpioPinX;
|
||||
GpioInitSt.GPIO_Mode = GpioMode;
|
||||
GpioInitSt.GPIO_Speed = GpioSpeed;
|
||||
|
||||
GPIO_Init(GpioX, &GpioInitSt);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 改变GPIO口状态
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void SetGpioSts(GPIO_TypeDef *GpioX, uint16_t GpioPinX, bool_t state)
|
||||
{
|
||||
if (state == RESET) {
|
||||
GPIO_ResetBits(GpioX, GpioPinX);
|
||||
} else if (state == SET){
|
||||
GPIO_SetBits(GpioX, GpioPinX);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取GPIO口状态
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
bool_t GetGpioSts(GPIO_TypeDef *GpioX, uint16_t GpioPinX)
|
||||
{
|
||||
return (bool_t)GPIO_ReadInputDataBit(GpioX, GpioPinX);
|
||||
}
|
||||
|
||||
176
Bsp/Src/Interrupt.c
Normal file
176
Bsp/Src/Interrupt.c
Normal file
@@ -0,0 +1,176 @@
|
||||
#include "Bsp.h"
|
||||
|
||||
SYSTEM_INT_REG SystemIntReg;
|
||||
|
||||
/**
|
||||
* @brief 禁止中断
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void DisAllowInt(void)
|
||||
{
|
||||
__set_PRIMASK(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 允许中断
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void AllowInt(void)
|
||||
{
|
||||
__set_PRIMASK(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 中断回调函数初始化为空
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void IntCbInit(void)
|
||||
{
|
||||
NVIC_PriorityGroupConfig(NVIC_GROUP_LEVEL);
|
||||
//memset(&SystemIntReg,NULL,sizeof(SYSTEM_INT_REG));
|
||||
}
|
||||
/**
|
||||
* @brief 中断回调函数注册
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void IntCbReg(uint32_t Vector, void(*Func)(uint32_t))
|
||||
{
|
||||
switch (Vector)
|
||||
{
|
||||
#ifdef USE_USART1
|
||||
case USART1_IRQn:
|
||||
SystemIntReg.Usart1.CallBack = Func;
|
||||
SystemIntReg.Usart1.IntId = USART1_BASE;
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_USART2
|
||||
case USART2_IRQn:
|
||||
SystemIntReg.Usart1.CallBack = Func;
|
||||
SystemIntReg.Usart1.IntId = USART2_BASE;
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_USART3
|
||||
case USART3_IRQn:
|
||||
SystemIntReg.Usart1.CallBack = Func;
|
||||
SystemIntReg.Usart1.IntId = USART3_BASE;
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_USART4
|
||||
case UART4_IRQn:
|
||||
SystemIntReg.Usart1.CallBack = Func;
|
||||
SystemIntReg.Usart1.IntId = UART4_BASE;
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_USART5
|
||||
case UART5_IRQn:
|
||||
SystemIntReg.Usart1.CallBack = Func;
|
||||
SystemIntReg.Usart1.IntId = UART5_BASE;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 中断NVIC配置
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void IntSetLevel(uint32_t Vector, uint8_t NvicPrePriority, uint8_t NvicSubPriority)
|
||||
{
|
||||
NVIC_InitTypeDef NVIC_InitStructure;
|
||||
|
||||
NVIC_InitStructure.NVIC_IRQChannel = Vector;
|
||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NvicPrePriority;
|
||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = NvicSubPriority;
|
||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&NVIC_InitStructure);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 关闭中断
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void SetIntDisable(uint32_t Vector)
|
||||
{
|
||||
NVIC_InitTypeDef NVIC_InitStructure;
|
||||
|
||||
NVIC_InitStructure.NVIC_IRQChannel = Vector;
|
||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&NVIC_InitStructure);
|
||||
}
|
||||
|
||||
#ifdef USE_USART1
|
||||
void USART1_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(USART1, USART_FLAG_ORE);
|
||||
}
|
||||
(*SystemIntReg.Usart1.CallBack)(SystemIntReg.Usart1.IntId);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_USART2
|
||||
void USART2_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(USART2, USART_FLAG_ORE);
|
||||
}
|
||||
(*SystemIntReg.Usart2.CallBack)((void*)SystemIntReg.Usart2.IntId);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_USART3
|
||||
void USART3_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(USART3, USART_FLAG_ORE);
|
||||
}
|
||||
(*SystemIntReg.Usart3.CallBack)((void*)SystemIntReg.Usart3.IntId);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_USART4
|
||||
void USART4_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(UART4, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(UART4, USART_FLAG_ORE);
|
||||
}
|
||||
(*SystemIntReg.Usart4.CallBack)((void*)SystemIntReg.Usart4.IntId);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_USART5
|
||||
void USART5_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(UART5, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(UART5, USART_FLAG_ORE);
|
||||
}
|
||||
(*SystemIntReg.Usart5.CallBack)((void*)SystemIntReg.Usart5.IntId);
|
||||
}
|
||||
#endif
|
||||
153
Bsp/Src/Usart.c
Normal file
153
Bsp/Src/Usart.c
Normal file
@@ -0,0 +1,153 @@
|
||||
#include "Bsp.h"
|
||||
|
||||
/**
|
||||
* @brief 使能GPIO的时钟
|
||||
* @param [in] GPIOx GPIO组
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void UsartClockEnable(uint32_t ComId, FunctionalState State)
|
||||
{
|
||||
switch (ComId) {
|
||||
case USART1_BASE:
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, State);
|
||||
break;
|
||||
case USART2_BASE:
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, State);
|
||||
break;
|
||||
case USART3_BASE:
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, State);
|
||||
break;
|
||||
case UART4_BASE:
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, State);
|
||||
break;
|
||||
case UART5_BASE:
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, State);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化USART口外设的时钟
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void BspInitUsartClock(void)
|
||||
{
|
||||
#ifdef USE_USART1
|
||||
UsartClockEnable(COM0,ENABLE);
|
||||
#endif
|
||||
#ifdef USE_USART2
|
||||
UsartClockEnable(COM1,ENABLE);
|
||||
#endif
|
||||
#ifdef USE_USART3
|
||||
UsartClockEnable(COM2,ENABLE);
|
||||
#endif
|
||||
#ifdef USE_USART4
|
||||
UsartClockEnable(COM3,ENABLE);
|
||||
#endif
|
||||
#ifdef USE_USART5
|
||||
UsartClockEnable(COM4,ENABLE);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 配置USART口
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void UsartConfig(uint32_t ComId, uint32_t baud, uint8_t DataBits, uint8_t StopBits, uint8_t Parity)
|
||||
{
|
||||
USART_InitTypeDef UsartInitSt;
|
||||
|
||||
//初始化串口
|
||||
USART_StructInit(&UsartInitSt);
|
||||
UsartInitSt.USART_BaudRate = baud;
|
||||
UsartInitSt.USART_WordLength = DataBits;
|
||||
UsartInitSt.USART_StopBits = StopBits;
|
||||
UsartInitSt.USART_Parity = Parity;
|
||||
UsartInitSt.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
||||
UsartInitSt.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
||||
USART_Init((USART_TypeDef*)ComId, &UsartInitSt);
|
||||
|
||||
//配置中断
|
||||
USART_ITConfig((USART_TypeDef*)ComId, USART_IT_RXNE, ENABLE);
|
||||
|
||||
//启用串口
|
||||
USART_Cmd((USART_TypeDef*)ComId, ENABLE);
|
||||
USART_GetFlagStatus((USART_TypeDef*)ComId, USART_FLAG_TC);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief USART口发送数据
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void UsartSendChar(uint32_t ComId,uint8_t Data)
|
||||
{
|
||||
USART_SendData((USART_TypeDef*)ComId, Data);
|
||||
while (USART_GetFlagStatus((USART_TypeDef*)ComId, USART_FLAG_TC) != SET);
|
||||
}
|
||||
/**
|
||||
* @brief USART口发送字符串
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void UsartSendStr(uint32_t ComId,uint8_t* Data, uint64_t Len)
|
||||
{
|
||||
for (uint64_t i = 0;i < Len;i++)
|
||||
{
|
||||
USART_SendData((USART_TypeDef*)ComId, Data[i]);
|
||||
while (USART_GetFlagStatus((USART_TypeDef*)ComId, USART_FLAG_TC) != SET);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief USART口发送数据
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
uint8_t UsartReceiveChar(uint32_t ComId)
|
||||
{
|
||||
return USART_ReceiveData((USART_TypeDef*)ComId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 通用USART配置
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void UsartStdConfig(uint32_t ComId, uint32_t baud)
|
||||
{
|
||||
UsartConfig(ComId, baud, DataBit_8, StopBit_1, Parity_No);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 高级串口配置
|
||||
* @param
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void UsartAdvConfig(uint32_t ComId, uint32_t baud, uint8_t DataBits, uint8_t StopBits, uint8_t Parity)
|
||||
{
|
||||
UsartConfig(ComId, baud, DataBits, StopBits, Parity);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user