重构BSP架构
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
#include "Bsp.h"
|
||||
|
||||
#ifdef USE_DIGITAL_OUTPUT
|
||||
GPIO_ST DigiTalOutPut[DO_NUM] =
|
||||
{
|
||||
GPIOB,GPIO_Pin_8,RESET,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef USE_DIGITAL_INPUT
|
||||
GPIO_ST DigiTalInPut[DI_NUM] =
|
||||
{
|
||||
GPIOF,GPIO_Pin_8,SET,
|
||||
GPIOE,GPIO_Pin_4,SET,
|
||||
GPIOE,GPIO_Pin_3,SET,
|
||||
};
|
||||
#endif
|
||||
|
||||
//LED灯数组
|
||||
#ifdef USE_LED
|
||||
GPIO_ST DigiTalLed[LED_NUM] =
|
||||
{
|
||||
GPIOB,GPIO_Pin_5,SET,
|
||||
GPIOE,GPIO_Pin_5,SET,
|
||||
};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief BSP的配置和初始化
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void BspInit(void)
|
||||
{
|
||||
//关闭所有系统中断
|
||||
INTERRUPT_DISABLE
|
||||
|
||||
//System Delay
|
||||
SystemDelayConfig();
|
||||
|
||||
//Interrupt
|
||||
SystemInterruptInit();
|
||||
|
||||
//Gpio
|
||||
SystemGpioInit();
|
||||
|
||||
{
|
||||
//DO
|
||||
#ifdef USE_DIGITAL_OUTPUT
|
||||
for (uint8_t i = 0; i < DO_NUM; i++) {
|
||||
GpioConfig(DigiTalOutPut[i].GpioPort,DigiTalOutPut[i].GpioPin,GPIO_Mode_Out_PP,GPIO_Speed_50MHz);
|
||||
GpioSetSts(DigiTalOutPut[i].GpioPort,DigiTalOutPut[i].GpioPin,DigiTalOutPut[i].DefaultStatus);
|
||||
}
|
||||
#endif
|
||||
//DI
|
||||
#ifdef USE_DIGITAL_INPUT
|
||||
for (uint8_t i = 0; i < DI_NUM; i++) {
|
||||
GpioConfig(DigiTalInPut[i].GpioPort,DigiTalInPut[i].GpioPin,GPIO_Mode_IPU,GPIO_Speed_50MHz);
|
||||
}
|
||||
#endif
|
||||
//LED
|
||||
#ifdef USE_LED
|
||||
for (uint8_t i = 0; i < LED_NUM; i++) {
|
||||
GpioConfig(DigiTalLed[i].GpioPort,DigiTalLed[i].GpioPin,GPIO_Mode_Out_PP,GPIO_Speed_50MHz);
|
||||
GpioSetSts(DigiTalLed[i].GpioPort,DigiTalLed[i].GpioPin,DigiTalLed[i].DefaultStatus);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//Usart
|
||||
SystemUsartInit();
|
||||
|
||||
{
|
||||
//串口的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_IPU,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_IPU,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
|
||||
}
|
||||
|
||||
#ifdef EXTRA_BSP
|
||||
BspExtraInit();
|
||||
#endif
|
||||
}
|
||||
|
||||
void SystemStart(void)
|
||||
{
|
||||
//开启系统中断
|
||||
INTERRUPT_ENABLE
|
||||
|
||||
#ifdef USE_RTOS
|
||||
#ifdef USE_FREERTOS
|
||||
#endif
|
||||
#ifdef USE_UCOS
|
||||
#endif
|
||||
#ifdef USE_THREADX
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 扩展库初始化
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note 理论上扩展库要在BSP的最后加载
|
||||
* @example void
|
||||
*/
|
||||
void BspExtraInit(void)
|
||||
{
|
||||
//LetterShell初始化
|
||||
#ifdef USE_SHELL
|
||||
LetterShellInit(TTY_COM,TTY_BAUD);
|
||||
#endif
|
||||
}
|
||||
|
||||
//用户层接口
|
||||
void BspSystemReboot(void)
|
||||
{
|
||||
INTERRUPT_DISABLE
|
||||
NVIC_SystemReset(); // 执行软件复位
|
||||
}
|
||||
/**
|
||||
* @brief 打开LED灯
|
||||
* @param Chnl 通道
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void LedOn(uint8_t Chnl)
|
||||
{
|
||||
if (Chnl >= LED_NUM)
|
||||
return;
|
||||
GpioSetSts(DigiTalLed[Chnl].GpioPort, DigiTalLed[Chnl].GpioPin, LED_ON);
|
||||
}
|
||||
/**
|
||||
* @brief 关闭LED灯
|
||||
* @param Chnl 通道
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void LedOff(uint8_t Chnl)
|
||||
{
|
||||
if (Chnl >= LED_NUM)
|
||||
return;
|
||||
GpioSetSts(DigiTalLed[Chnl].GpioPort, DigiTalLed[Chnl].GpioPin, LED_OFF);
|
||||
}
|
||||
|
||||
void LedSet(uint8_t Chnl,uint8_t Sts)
|
||||
{
|
||||
if (Chnl >= LED_NUM)
|
||||
return;
|
||||
GpioSetSts(DigiTalLed[Chnl].GpioPort, DigiTalLed[Chnl].GpioPin, Sts);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 切换LED灯状态
|
||||
* @param Chnl 通道 Status 状态
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void LedToggle(uint8_t Chnl)
|
||||
{
|
||||
if (Chnl >= LED_NUM)
|
||||
return;
|
||||
if (GpioGetSts(DigiTalLed[Chnl].GpioPort, DigiTalLed[Chnl].GpioPin) == LED_ON)
|
||||
{
|
||||
GpioSetSts(DigiTalLed[Chnl].GpioPort,DigiTalLed[Chnl].GpioPin,LED_OFF);
|
||||
}
|
||||
else
|
||||
{
|
||||
GpioSetSts(DigiTalLed[Chnl].GpioPort,DigiTalLed[Chnl].GpioPin,LED_ON);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @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
|
||||
@@ -0,0 +1,68 @@
|
||||
#ifndef __BSP_H__
|
||||
#define __BSP_H__
|
||||
|
||||
/* 板级BSP头文件 */
|
||||
#include "Board.h"
|
||||
|
||||
/* SHELL头文件 */
|
||||
#include "LetterShell.h"
|
||||
|
||||
/* BSP版本 */
|
||||
#define VERSION_0 0
|
||||
#define VERSION_1 1
|
||||
#define VERSION_2 2
|
||||
|
||||
/* RTOS宏开关 */
|
||||
#ifdef USE_RTOS
|
||||
#ifdef USE_THREADX
|
||||
#include "tx_api.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* BOOL类型定义 */
|
||||
typedef enum {
|
||||
false = 0,
|
||||
true = 1,
|
||||
} bool_t;
|
||||
|
||||
//System
|
||||
void BspInit(void);
|
||||
void BspExtraInit(void);
|
||||
void SystemStart(void);
|
||||
void BspSystemReboot(void);
|
||||
|
||||
//GPIO
|
||||
//数组信号输出开关
|
||||
#define DO_ON 0
|
||||
#define DO_OFF 1
|
||||
//LED灯开关
|
||||
#define LED_ON 0
|
||||
#define LED_OFF 1
|
||||
void SystemGpioInit(void);
|
||||
void GpioConfig(GPIO_TypeDef *GpioX, uint16_t GpioPinX,GPIOMode_TypeDef GpioMode, GPIOSpeed_TypeDef GpioSpeed);
|
||||
void GpioSetSts(GPIO_TypeDef *GpioX, uint16_t GpioPinX, uint8_t Status);
|
||||
uint8_t GpioGetSts(GPIO_TypeDef *GpioX, uint16_t GpioPinX);
|
||||
void LedToggle(uint8_t Chnl);
|
||||
void LedOff(uint8_t Chnl);
|
||||
void LedOn(uint8_t Chnl);
|
||||
|
||||
//System Delay
|
||||
void SystemDelayConfig(void);
|
||||
uint32_t SystemGetDwtCnt(void);
|
||||
void SystemDelayUs(uint32_t Us);
|
||||
void SystemDelayMs(uint32_t Ms);
|
||||
|
||||
//Interrupt
|
||||
void SystemInterruptInit(void);
|
||||
void InterruptRegister(uint32_t Irqn, void(*Func)(uint32_t));
|
||||
void InterruptSetLevel(uint32_t Vector, uint8_t NvicPrePriority, uint8_t NvicSubPriority);
|
||||
void InterruptDisable(uint32_t Vector);
|
||||
|
||||
//Usart
|
||||
void SystemUsartInit(void);
|
||||
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 UsartStdConfig(uint32_t ComId, uint32_t baud);
|
||||
void UsartAdvConfig(uint32_t ComId, uint32_t baud, uint8_t DataBits, uint8_t StopBits, uint8_t Parity);
|
||||
#endif
|
||||
+64
@@ -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 SystemDelayConfig(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 SystemGetDwtCnt(void)
|
||||
{
|
||||
return((uint32_t)DWT_CYCCNT);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 微秒级延时函数
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void SystemDelayUs(uint32_t Us)
|
||||
{
|
||||
uint32_t Start = 0,End = 0,Ts = 0;
|
||||
Start = SystemGetDwtCnt();
|
||||
|
||||
Ts = Us * (SystemCoreClock / 1000000U);
|
||||
|
||||
End = Start + Ts;
|
||||
|
||||
while(SystemGetDwtCnt() < End){;}
|
||||
}
|
||||
/**
|
||||
* @brief 毫秒级延时函数
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void SystemDelayMs(uint32_t Ms)
|
||||
{
|
||||
SystemDelayUs(Ms * 1000);
|
||||
}
|
||||
+124
@@ -0,0 +1,124 @@
|
||||
#include "Bsp.h"
|
||||
|
||||
#ifdef USE_DIGITAL_OUTPUT
|
||||
extern GPIO_ST DigiTalOutPut[DO_NUM];
|
||||
#endif
|
||||
|
||||
#ifdef USE_DIGITAL_INPUT
|
||||
extern GPIO_ST DigiTalInPut[DI_NUM];
|
||||
#endif
|
||||
|
||||
//LED灯数组
|
||||
#ifdef USE_LED
|
||||
extern GPIO_ST DigiTalLed[LED_NUM];
|
||||
#endif
|
||||
|
||||
void SystemEnableGpioClock(uint32_t GpioBase)
|
||||
{
|
||||
if(GpioBase == (uint32_t)GPIOA)
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
|
||||
|
||||
if(GpioBase == (uint32_t)GPIOB)
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
|
||||
|
||||
if(GpioBase == (uint32_t)GPIOC)
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
|
||||
|
||||
if(GpioBase == (uint32_t)GPIOD)
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
|
||||
|
||||
if(GpioBase == (uint32_t)GPIOE)
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
|
||||
|
||||
if(GpioBase == (uint32_t)GPIOF)
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
|
||||
|
||||
if(GpioBase == (uint32_t)GPIOG)
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化GPIO口外设的时钟
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void SystemGpioInit(void)
|
||||
{
|
||||
uint8_t i = 0x00;
|
||||
|
||||
if (DO_NUM != NULL)
|
||||
{
|
||||
for (i = 0;i < DO_NUM;i++)
|
||||
{
|
||||
SystemEnableGpioClock((uint32_t)DigiTalOutPut[i].GpioPort);
|
||||
}
|
||||
}
|
||||
|
||||
if (DI_NUM != NULL)
|
||||
{
|
||||
for (i = 0;i < DI_NUM;i++)
|
||||
{
|
||||
SystemEnableGpioClock((uint32_t)DigiTalInPut[i].GpioPort);
|
||||
}
|
||||
}
|
||||
|
||||
if (LED_NUM != NULL)
|
||||
{
|
||||
for (i = 0;i < LED_NUM;i++)
|
||||
{
|
||||
SystemEnableGpioClock((uint32_t)DigiTalLed[i].GpioPort);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 配置GPIO口
|
||||
* @param GpioX:GPIO组 GpioPinX:GPIO引脚 GpioMode:GPIO模式 GpioSpeed:GPIO速度
|
||||
* @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 GpioX:GPIO组 GpioPinX:GPIO引脚 state: GPIO状态
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void GpioSetSts(GPIO_TypeDef *GpioX, uint16_t GpioPinX, uint8_t Status)
|
||||
{
|
||||
if (Status == (uint8_t)RESET)
|
||||
{
|
||||
GPIO_ResetBits(GpioX, GpioPinX);
|
||||
}
|
||||
else if (Status == (uint8_t)SET)
|
||||
{
|
||||
GPIO_SetBits(GpioX, GpioPinX);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取GPIO口状态
|
||||
* @param GpioX:GPIO组 GpioPinX:GPIO引脚
|
||||
* @retval GPIO状态
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
uint8_t GpioGetSts(GPIO_TypeDef *GpioX, uint16_t GpioPinX)
|
||||
{
|
||||
return (uint8_t)GPIO_ReadInputDataBit(GpioX, GpioPinX);
|
||||
}
|
||||
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
#include "Bsp.h"
|
||||
|
||||
INTERRUPT_ST Interrupt[INTERRUPT_NUM];
|
||||
|
||||
/**
|
||||
* @brief 中断回调函数初始化为空
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note 初始化系统中断
|
||||
* @example void
|
||||
*/
|
||||
void SystemInterruptInit(void)
|
||||
{
|
||||
//设定系统中断组
|
||||
NVIC_PriorityGroupConfig(NVIC_GROUP_LEVEL);
|
||||
//清空结构体
|
||||
for (uint8_t i = 0;i < INTERRUPT_NUM;i++)
|
||||
{
|
||||
Interrupt[i].CallBack = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 中断回调函数注册
|
||||
* @param Vector:中断号 void(*Func)(uint32_t):回调函数
|
||||
* @retval void
|
||||
* @note 将外部传入的函数地址关联到INTERRUPT_ST表中
|
||||
* @example void
|
||||
*/
|
||||
void InterruptRegister(uint32_t Irqn, void(*Func)(uint32_t))
|
||||
{
|
||||
Interrupt[Irqn].CallBack = Func;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 中断NVIC配置
|
||||
* @param Vector:中断号 NvicPrePriority:主优先级 NvicSubPriority:抢占优先级
|
||||
* @retval void
|
||||
* @note 设定一个中断的优先级
|
||||
* @example void
|
||||
*/
|
||||
void InterruptSetLevel(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 Vector:中断号
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void InterruptDisable(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);
|
||||
}
|
||||
|
||||
void USART1_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(USART1, USART_FLAG_ORE);
|
||||
}
|
||||
(*Interrupt[USART1_IRQn].CallBack)((uint32_t)USART1);
|
||||
}
|
||||
|
||||
void USART2_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(USART2, USART_FLAG_ORE);
|
||||
}
|
||||
(*Interrupt[USART2_IRQn].CallBack)((uint32_t)USART2);
|
||||
}
|
||||
|
||||
void USART3_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(USART3, USART_FLAG_ORE);
|
||||
}
|
||||
(*Interrupt[USART3_IRQn].CallBack)((uint32_t)USART3);
|
||||
}
|
||||
|
||||
|
||||
void USART4_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(UART4, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(UART4, USART_FLAG_ORE);
|
||||
}
|
||||
(*Interrupt[UART4_IRQn].CallBack)((uint32_t)UART4);
|
||||
}
|
||||
|
||||
void USART5_IRQHandler(void)
|
||||
{
|
||||
if (USART_GetFlagStatus(UART5, USART_FLAG_ORE) == SET)
|
||||
{
|
||||
USART_ClearFlag(UART5, USART_FLAG_ORE);
|
||||
}
|
||||
(*Interrupt[UART5_IRQn].CallBack)((uint32_t)UART5);
|
||||
}
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
#include "Bsp.h"
|
||||
|
||||
/**
|
||||
* @brief 初始化USART口外设的时钟
|
||||
* @param void
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void SystemUsartInit(void)
|
||||
{
|
||||
#ifdef USE_USART1
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
|
||||
#endif
|
||||
#ifdef USE_USART2
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
|
||||
#endif
|
||||
#ifdef USE_USART3
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
|
||||
#endif
|
||||
#ifdef USE_USART4
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
|
||||
#endif
|
||||
#ifdef USE_USART5
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 配置USART口
|
||||
* @param ComId 串口号 baud 波特率 DataBits 数据位 StopBits 停止位 Parity校验位
|
||||
* @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);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief USART口发送数据
|
||||
* @param ComId 串口号 Data数据
|
||||
* @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 ComId 串口号 Data数据 Len 长度
|
||||
* @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 ComId 串口号
|
||||
* @retval 读取的数据
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
uint8_t UsartReceiveChar(uint32_t ComId)
|
||||
{
|
||||
return USART_ReceiveData((USART_TypeDef*)ComId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 通用USART配置
|
||||
* @param ComId 串口号 baud 波特率
|
||||
* @retval void
|
||||
* @note void
|
||||
* @example void
|
||||
*/
|
||||
void UsartStdConfig(uint32_t ComId, uint32_t baud)
|
||||
{
|
||||
UsartConfig(ComId, baud, USART_DATA_BIT_8, USART_STOP_BIT_1, USART_PARITY_NO);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 高级串口配置
|
||||
* @param ComId 串口号 baud 波特率 DataBits 数据位 StopBits 停止位 Parity校验位
|
||||
* @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