换血大更新

This commit is contained in:
XerolySkinner
2023-03-06 12:44:58 +08:00
parent dcee54c50d
commit d14d2c5c95
933 changed files with 7422 additions and 2824 deletions

View File

@@ -210,4 +210,70 @@ void bsp_IIC::IIC_Read(u8 id,u8 addr,u8* dat,u32 len){
IIC_Stop();
return;}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// bsp适配
#ifdef _STM32_HAL_
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 构造函数
//
/**
* @brief STM32的IIC软件发生器
*
* @param *GPIOx_SCK SCK的端口
* @param GPIO_Pin_SCK SCK的管口号
* @param *GPIOx_SDA SDA的端口
* @param GPIO_Pin_SDA SDA的管口号
*/
bsp_IIC_STM32::bsp_IIC_STM32(GPIO_TypeDef *GPIOx_SCK,uint16_t GPIO_Pin_SCK,GPIO_TypeDef *GPIOx_SDA,uint16_t GPIO_Pin_SDA){
bsp_IIC_STM32::GPIOx_SCK=GPIOx_SCK;
bsp_IIC_STM32::GPIO_Pin_SCK=GPIO_Pin_SCK;
bsp_IIC_STM32::GPIOx_SDA=GPIOx_SDA;
bsp_IIC_STM32::GPIO_Pin_SDA=GPIO_Pin_SDA;}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 适配程序
//
/**
* @brief
*
*/
void bsp_IIC_STM32::IIC_Delay(void) {
u8 i = 0;
while (++i);}
/**
* @brief SCK管脚口
*
* @param var ,IIC_SET置位管脚,IIC_RESET复位管脚
* @return var为IIC_READ时返回管脚状态
*/
u8 bsp_IIC_STM32::IIC_SCK(u8 var) {
if (var == IIC_RESET) {
HAL_GPIO_WritePin(GPIOx_SCK, GPIO_Pin_SCK, GPIO_PIN_RESET);
return 2;}
else if (var == IIC_SET) {
HAL_GPIO_WritePin(GPIOx_SCK, GPIO_Pin_SCK, GPIO_PIN_SET);
return 2;}
else {
return HAL_GPIO_ReadPin(GPIOx_SCK, GPIO_Pin_SCK);
}}
/**
* @brief SDA管脚口
* @param var ,IIC_SET置位管脚,IIC_RESET复位管脚
* @return var为IIC_READ时返回管脚状态
*/
u8 bsp_IIC_STM32::IIC_SDA(u8 var) {
if (var == IIC_RESET) {
HAL_GPIO_WritePin(GPIOx_SDA, GPIO_Pin_SDA, GPIO_PIN_RESET);
return 2;}
else if (var == IIC_SET) {
HAL_GPIO_WritePin(GPIOx_SDA, GPIO_Pin_SDA, GPIO_PIN_SET);
return 2;}
else {
return HAL_GPIO_ReadPin(GPIOx_SDA, GPIO_Pin_SDA);
}}
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -34,6 +34,7 @@
#ifdef __cplusplus
#pragma once
#include "User.h"
#include "varint.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
@@ -91,5 +92,30 @@ class bsp_IIC{
virtual void IIC_Delay(void) = 0;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// bsp适配
#ifdef _STM32_HAL_
#include "gpio.h"
/**
* @brief STM32版本的软件IIC
* 使
*/
class bsp_IIC_STM32 :public bsp_IIC{
public:
bsp_IIC_STM32(GPIO_TypeDef *GPIOx_SCK,uint16_t GPIO_Pin_SCK,GPIO_TypeDef *GPIOx_SDA,uint16_t GPIO_Pin_SDA);
protected:
virtual u8 IIC_SCK(u8 var);
virtual u8 IIC_SDA(u8 var);
virtual void IIC_Delay(void);
public:
GPIO_TypeDef *GPIOx_SCK;
uint16_t GPIO_Pin_SCK;
GPIO_TypeDef *GPIOx_SDA;
uint16_t GPIO_Pin_SDA;
};
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -22,7 +22,7 @@
*/
/**
* @file bsp_OLED_STM32.cpp
* @file bsp_OLED.cpp
* @brief STM32下实现OLED通信
* @mainpage
* @author Yuankang Liang(XerolySkinner)
@@ -32,8 +32,7 @@
*/
#ifdef __cplusplus
#include "bsp_IIC_STM32.h"
#include "bsp_OLED_STM32.h"
#include "bsp_OLED.h"
extern const u8 OLED_WORD_ASCII[];
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
@@ -43,14 +42,14 @@ extern const u8 OLED_WORD_ASCII[];
* @brief OLED
* @param cmd
*/
void bsp_STM32_OLED::Send_cmd(u8 cmd) {
void bsp_OLED::Send_cmd(u8 cmd) {
IIC_WriteOneByte(0x3C, 0x00, cmd);}
//----------------------------------------------------------------------------------------------------
/**
* @brief OLED
* @param dat
*/
void bsp_STM32_OLED::Send_dat(u8 dat) {
void bsp_OLED::Send_dat(u8 dat) {
IIC_WriteOneByte(0x3C, 0x40, dat);}
//----------------------------------------------------------------------------------------------------
/**
@@ -58,14 +57,14 @@ void bsp_STM32_OLED::Send_dat(u8 dat) {
* @param *dat
* @param len
*/
void bsp_STM32_OLED::Send_len_dat(u8* dat, u32 len) {
void bsp_OLED::Send_len_dat(u8* dat, u32 len) {
IIC_Write(0x3C, 0x40, (u8*)dat, len);}
//----------------------------------------------------------------------------------------------------
/**
* @brief
* @param column
*/
void bsp_STM32_OLED::Column_set(u8 column) {
void bsp_OLED::Column_set(u8 column) {
Send_cmd(0x10 | (column >> 4)); //设置列地址高位
Send_cmd(0x00 | (column & 0x0f)); //设置列地址低位
}
@@ -74,14 +73,14 @@ void bsp_STM32_OLED::Column_set(u8 column) {
* @brief
* @param page
*/
void bsp_STM32_OLED::Page_set(u8 page) {
void bsp_OLED::Page_set(u8 page) {
Send_cmd(0xb0 + page);}
//----------------------------------------------------------------------------------------------------
/**
* @brief
* @param dat ,0x00,0xFF
*/
void bsp_STM32_OLED::Clear(u8 dat) {
void bsp_OLED::Clear(u8 dat) {
u8 page;
for (page = 0; page < 8; page++) {
Page_set(page);
@@ -100,7 +99,7 @@ void bsp_STM32_OLED::Clear(u8 dat) {
* @brief OLED绘图
* @param *ptr_pic
*/
void bsp_STM32_OLED::Picture_display(const u8* ptr_pic) {
void bsp_OLED::Picture_display(const u8* ptr_pic) {
u8 page;
for (page = 0; page < (64 / 8); page++) {
Page_set(page);
@@ -120,7 +119,7 @@ void bsp_STM32_OLED::Picture_display(const u8* ptr_pic) {
* @brief OLED反向绘图
* @param *ptr_pic
*/
void bsp_STM32_OLED::Picture_ReverseDisplay(const u8* ptr_pic) {
void bsp_OLED::Picture_ReverseDisplay(const u8* ptr_pic) {
u8 page;
for (page = 0; page < (64 / 8); page++) {
Page_set(page);
@@ -142,7 +141,7 @@ void bsp_STM32_OLED::Picture_ReverseDisplay(const u8* ptr_pic) {
* @param V
* @param word
*/
void bsp_STM32_OLED::Draw_ASCII(u32 H, u32 V, u8 word) {
void bsp_OLED::Draw_ASCII(u32 H, u32 V, u8 word) {
word -= 33;
Page_set(V * 2);
Column_set(H * 8);
@@ -155,7 +154,7 @@ void bsp_STM32_OLED::Draw_ASCII(u32 H, u32 V, u8 word) {
* @brief OLED初始化
*
*/
void bsp_STM32_OLED::Init(void) {
void bsp_OLED::Init(void) {
for (int i = 0; i < 25; i++)
Send_cmd(OLED_init_cmd[i]);}
//////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -22,7 +22,7 @@
*/
/**
* @file bsp_OLED_STM32.h
* @file bsp_OLED.h
* @brief STM32下实现OLED通信
* @mainpage
* @author Yuankang Liang(XerolySkinner)
@@ -38,7 +38,7 @@
// 头文件
//
#include "varint.h"
#include "bsp_IIC_STM32.h"
#include "bsp_IIC.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 数据声明
@@ -78,14 +78,14 @@ const u8 OLED_init_cmd[25] = {
/**
* @brief OLED设备,STM32使用IIC总线
*/
class bsp_STM32_OLED :
class bsp_OLED :
protected bsp_IIC_STM32{
public:
bsp_STM32_OLED(bsp_IIC_STM32 &IICS):bsp_IIC_STM32(
bsp_OLED(bsp_IIC_STM32 &IICS):bsp_IIC_STM32(
IICS.GPIOx_SCK,IICS.GPIO_Pin_SCK,
IICS.GPIOx_SDA,IICS.GPIO_Pin_SDA
){;};
bsp_STM32_OLED(GPIO_TypeDef *GPIOx_SCK,uint16_t GPIO_Pin_SCK,GPIO_TypeDef *GPIOx_SDA,uint16_t GPIO_Pin_SDA):bsp_IIC_STM32(
bsp_OLED(GPIO_TypeDef *GPIOx_SCK,uint16_t GPIO_Pin_SCK,GPIO_TypeDef *GPIOx_SDA,uint16_t GPIO_Pin_SDA):bsp_IIC_STM32(
GPIOx_SCK,GPIO_Pin_SCK,GPIOx_SDA,GPIO_Pin_SDA
){;};
public:

View File

@@ -1,99 +0,0 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_IIC_STM32.cpp
* @brief 实现针对STM32的软件IIC类
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-07 00:56
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 头文件
#include "bsp_IIC_STM32.h"
#include "gpio.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 构造函数
//
/**
* @brief 构造STM32的IIC软件发生器
*
* @param *GPIOx_SCK SCK的端口
* @param GPIO_Pin_SCK SCK的管口号
* @param *GPIOx_SDA SDA的端口
* @param GPIO_Pin_SDA SDA的管口号
*/
bsp_IIC_STM32::bsp_IIC_STM32(GPIO_TypeDef *GPIOx_SCK,uint16_t GPIO_Pin_SCK,GPIO_TypeDef *GPIOx_SDA,uint16_t GPIO_Pin_SDA){
bsp_IIC_STM32::GPIOx_SCK=GPIOx_SCK;
bsp_IIC_STM32::GPIO_Pin_SCK=GPIO_Pin_SCK;
bsp_IIC_STM32::GPIOx_SDA=GPIOx_SDA;
bsp_IIC_STM32::GPIO_Pin_SDA=GPIO_Pin_SDA;}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 适配程序
//
/**
* @brief 时序中的延时
* 在此处短暂延时
*/
void bsp_IIC_STM32::IIC_Delay(void) {
u8 i = 0;
while (++i);}
/**
* @brief 控制SCK管脚口
*
* @param var 此处有三个状态,IIC_SET置位管脚,IIC_RESET复位管脚
* @return 当var为IIC_READ时返回管脚状态
*/
u8 bsp_IIC_STM32::IIC_SCK(u8 var) {
if (var == IIC_RESET) {
HAL_GPIO_WritePin(GPIOx_SCK, GPIO_Pin_SCK, GPIO_PIN_RESET);
return 2;}
else if (var == IIC_SET) {
HAL_GPIO_WritePin(GPIOx_SCK, GPIO_Pin_SCK, GPIO_PIN_SET);
return 2;}
else {
return HAL_GPIO_ReadPin(GPIOx_SCK, GPIO_Pin_SCK);
}}
/**
* @brief 控制SDA管脚口
* @param var 此处有三个状态,IIC_SET置位管脚,IIC_RESET复位管脚
* @return 当var为IIC_READ时返回管脚状态
*/
u8 bsp_IIC_STM32::IIC_SDA(u8 var) {
if (var == IIC_RESET) {
HAL_GPIO_WritePin(GPIOx_SDA, GPIO_Pin_SDA, GPIO_PIN_RESET);
return 2;}
else if (var == IIC_SET) {
HAL_GPIO_WritePin(GPIOx_SDA, GPIO_Pin_SDA, GPIO_PIN_SET);
return 2;}
else {
return HAL_GPIO_ReadPin(GPIOx_SDA, GPIO_Pin_SDA);
}}
//////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -1,70 +0,0 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_IIC_STM32.h
* @brief 实现针对STM32的软件IIC类
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-07 00:56
*/
/*----------------------------------------------------------------------------------------------------
名字:bsp_IIC_STM32
时间:20221107-0056
程序员:梁源康
说明:主程序
*/
#pragma once
#ifdef __cplusplus
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 头文件
#include "gpio.h"
#include "varint.h"
#include "bsp_IIC.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类目
/**
* @brief STM32版本的软件IIC
* 需要使用构造函数初始化
*/
class bsp_IIC_STM32 :public bsp_IIC{
public:
bsp_IIC_STM32(GPIO_TypeDef *GPIOx_SCK,uint16_t GPIO_Pin_SCK,GPIO_TypeDef *GPIOx_SDA,uint16_t GPIO_Pin_SDA);
protected:
u8 IIC_SCK(u8 var);
u8 IIC_SDA(u8 var);
virtual void IIC_Delay(void);
public:
GPIO_TypeDef *GPIOx_SCK;
uint16_t GPIO_Pin_SCK;
GPIO_TypeDef *GPIOx_SDA;
uint16_t GPIO_Pin_SDA;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -1,57 +0,0 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_ModBus_STM32.h
* @brief ModBus通信基于STM32
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-22 01:28
*/
#pragma once
#include "bsp_ModBus.h"
#include "usart.h"
#include "varint.h"
#ifdef __cplusplus
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类目
/**
* @brief STM32用串口的ModBus发送器
*/
class bsp_ModBus_STM32:public bsp_ModBus_Tx {
public:
bsp_ModBus_STM32(UART_HandleTypeDef* huart,u8 ID,uint32_t Timeout):bsp_ModBus_Tx(ID){
bsp_ModBus_STM32::huart = huart;
bsp_ModBus_STM32::Timeout = Timeout;}
protected:
virtual void Transmit(u8 *dat, u16 len){
HAL_UART_Transmit(huart,dat,len,0xFF);}
private:
UART_HandleTypeDef* huart;
uint32_t Timeout;};
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -0,0 +1,75 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_IDLEUART.cpp
* @brief 空闲接收字符
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date Fri Jan 20 00:40:10 2023
*/
#include "bsp_IDLEUART.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类函数
/**
* @brief title
* @param var vars
* @return res
*/
void bsp_IDLEUART::init(void){
HAL_TIM_Base_Stop_IT(htim);
HAL_UART_Receive_IT(huart,&temp,1);}
//----------------------------------------------------------------------------------------------------
void bsp_IDLEUART::callback_TIM(void){
*buff='\0';
buff=buffhead;
HAL_TIM_Base_Stop_IT(htim);}
//----------------------------------------------------------------------------------------------------
void bsp_IDLEUART::callback_UART(void){
__HAL_TIM_CLEAR_IT(htim,TIM_IT_UPDATE);
HAL_TIM_Base_Start_IT(htim);
__HAL_TIM_SetCounter(htim,0);
*(buff++)=temp;
len++;
HAL_UART_Receive_IT(huart,&temp,1);}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 构造函数
bsp_IDLEUART::bsp_IDLEUART(UART_HandleTypeDef *huart,TIM_HandleTypeDef *htim):bsp_PrintArt_STM32(huart){
bsp_IDLEUART::huart=huart;
bsp_IDLEUART::htim=htim;
len=0;
buff=(u8*)malloc(128);
buffhead=buff;}
//----------------------------------------------------------------------------------------------------
bsp_IDLEUART::bsp_IDLEUART(UART_HandleTypeDef *huart,TIM_HandleTypeDef *htim,u32 len):bsp_PrintArt_STM32(huart){
bsp_IDLEUART::huart=huart;
bsp_IDLEUART::htim=htim;
len=0;
buff=(u8*)malloc(len);
buffhead=buff;}
//////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,67 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_IDLEUART.h
* @brief 空闲接收字符
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date Fri Jan 20 00:40:10 2023
*/
#pragma once
#ifdef __cplusplus
#include "varint.h"
#include "bsp_PrintArt.h"
#include "stdlib.h"
#include "string.h"
#include "usart.h"
#include "tim.h"
#define comcase(str,buff) if((strcmp(#str,(char*)(buff))==0))
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类目
/**
* @brief TODO
*/
class bsp_IDLEUART:public bsp_PrintArt_STM32{
public:
bsp_IDLEUART(UART_HandleTypeDef *huart,TIM_HandleTypeDef *htim);
bsp_IDLEUART(UART_HandleTypeDef *huart,TIM_HandleTypeDef *htim,u32 len);
public:
void init(void);
void callback_TIM(void);
void callback_UART(void);
public:
UART_HandleTypeDef *huart;
TIM_HandleTypeDef *htim;
u8* buff;
u8* buffhead;
u32 len;
u8 temp;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -45,9 +45,9 @@
* @brief
* @param address
* @param mem
* @return ÎÞ·µ»ØÖµ
* @return ,
*/
void bsp_ModBus_Tx::ReadKeepReg(u16 address, u16 mem) {
u16 bsp_ModBus_Tx::ReadKeepReg(u16 address, u16 mem) {
u8 dat[8];
u16 crc;
dat[0] = ID;
@@ -59,15 +59,16 @@ void bsp_ModBus_Tx::ReadKeepReg(u16 address, u16 mem) {
crc = CRC16_MODBUS(dat, 6);
dat[6] = ((u8*)(&crc))[0];
dat[7] = ((u8*)(&crc))[1];
Transmit(dat,8);}
Transmit(dat,8);
return 5+mem;}
//----------------------------------------------------------------------------------------------------
/**
* @brief
* @param address
* @param mem
* @return ÎÞ·µ»ØÖµ
* @return ,
*/
void bsp_ModBus_Tx::ReadInReg(u16 address, u16 mem) {
u16 bsp_ModBus_Tx::ReadInReg(u16 address, u16 mem) {
u8 dat[8];
u16 crc;
dat[0] = ID;
@@ -79,15 +80,16 @@ void bsp_ModBus_Tx::ReadInReg(u16 address, u16 mem) {
crc = CRC16_MODBUS(dat,6);
dat[6] = ((u8*)(&crc))[0];
dat[7] = ((u8*)(&crc))[1];
Transmit(dat, 8);}
Transmit(dat, 8);
return 5+mem;}
//----------------------------------------------------------------------------------------------------
/**
* @brief
* @param address
* @param var
* @return ÎÞ·µ»ØÖµ
* @return ,
*/
void bsp_ModBus_Tx::WriteOneReg(u16 address, u16 var) {
u16 bsp_ModBus_Tx::WriteOneReg(u16 address, u16 var) {
u8 dat[8];
u16 crc;
dat[0] = ID;
@@ -99,20 +101,21 @@ void bsp_ModBus_Tx::WriteOneReg(u16 address, u16 var) {
crc = CRC16_MODBUS(dat, 6);
dat[6] = ((u8*)(&crc))[0];
dat[7] = ((u8*)(&crc))[1];
Transmit(dat, 8);}
Transmit(dat, 8);
return 8;}
//----------------------------------------------------------------------------------------------------
/**
* @brief
* @param address
* @param mem
* @param *var
* @return ÎÞ·µ»ØÖµ
* @return ,
* @note 使WriteRegsVar
*/
void bsp_ModBus_Tx::WriteRegs(u16 address,u16 mem,u16* var) {
u16 bsp_ModBus_Tx::WriteRegs(u16 address,u16 mem,u16* var) {
u8 bytes = 9 + mem * 2;
u8* dat = (u8*)malloc(bytes);
if (dat == NULL)return;
if (dat == NULL)return 0;
u16 crc;
dat[0] = ID;
dat[1] = Fun_W_Regs;
@@ -129,7 +132,8 @@ void bsp_ModBus_Tx::WriteRegs(u16 address,u16 mem,u16* var) {
dat[bytes - 2] = ((u8*)(&crc))[0];
dat[bytes - 1] = ((u8*)(&crc))[1];
Transmit(dat, bytes);
free(dat);}
free(dat);
return 8;}
//----------------------------------------------------------------------------------------------------
/**
* @brief
@@ -137,15 +141,15 @@ void bsp_ModBus_Tx::WriteRegs(u16 address,u16 mem,u16* var) {
* @param mem
* @param var
* mem的数量决定此处数量
* @return ÎÞ·µ»ØÖµ
* @return ,
*/
void bsp_ModBus_Tx::WriteRegsVar(u16 address, u16 mem,...) {
u16 bsp_ModBus_Tx::WriteRegsVar(u16 address, u16 mem,...) {
va_list table;
va_start(table,mem);
u16 vars;
u8 bytes = 9 + mem * 2;
u8* dat = (u8*)malloc(bytes);
if (dat == NULL)return;
if (dat == NULL)return 0;
u16 crc;
dat[0] = ID;
dat[1] = Fun_W_Regs;
@@ -164,15 +168,16 @@ void bsp_ModBus_Tx::WriteRegsVar(u16 address, u16 mem,...) {
dat[bytes - 1] = ((u8*)(&crc))[1];
Transmit(dat, bytes);
free(dat);
va_end(table);}
va_end(table);
return 8;}
//----------------------------------------------------------------------------------------------------
/**
* @brief 线
* @param address
* @param mem
* @return ÎÞ·µ»ØÖµ
* @return ,
*/
void bsp_ModBus_Tx::ReadOutCoil(u16 address, u16 mem) {
u16 bsp_ModBus_Tx::ReadOutCoil(u16 address, u16 mem) {
u8 dat[8];
u16 crc;
dat[0] = ID;
@@ -184,15 +189,16 @@ void bsp_ModBus_Tx::ReadOutCoil(u16 address, u16 mem) {
crc = CRC16_MODBUS(dat, 6);
dat[6] = ((u8*)(&crc))[0];
dat[7] = ((u8*)(&crc))[1];
Transmit(dat, 8);}
Transmit(dat, 8);
return 5+((mem/8)+((mem%8)!=0));}
//----------------------------------------------------------------------------------------------------
/**
* @brief 线
* @param address
* @param mem
* @return ÎÞ·µ»ØÖµ
* @return ,
*/
void bsp_ModBus_Tx::ReadInCoil(u16 address, u16 mem) {
u16 bsp_ModBus_Tx::ReadInCoil(u16 address, u16 mem) {
u8 dat[8];
u16 crc;
dat[0] = ID;
@@ -204,7 +210,8 @@ void bsp_ModBus_Tx::ReadInCoil(u16 address, u16 mem) {
crc = CRC16_MODBUS(dat, 6);
dat[6] = ((u8*)(&crc))[0];
dat[7] = ((u8*)(&crc))[1];
Transmit(dat, 8);}
Transmit(dat, 8);
return 5+((mem/8)+((mem%8)!=0));}
//----------------------------------------------------------------------------------------------------
/**
* @brief 线
@@ -212,9 +219,9 @@ void bsp_ModBus_Tx::ReadInCoil(u16 address, u16 mem) {
* @param state
* 0:
* :
* @return ÎÞ·µ»ØÖµ
* @return ,
*/
void bsp_ModBus_Tx::WriteOneCoil(u16 address, u16 state){
u16 bsp_ModBus_Tx::WriteOneCoil(u16 address, u16 state){
u8 dat[8];
u16 var = state ? 0xFF00 : 0x0000;
u16 crc;
@@ -227,20 +234,21 @@ void bsp_ModBus_Tx::WriteOneCoil(u16 address, u16 state){
crc = CRC16_MODBUS(dat, 6);
dat[6] = ((u8*)(&crc))[0];
dat[7] = ((u8*)(&crc))[1];
Transmit(dat, 8);}
Transmit(dat, 8);
return 8;}
//----------------------------------------------------------------------------------------------------
/**
* @brief 线
* @param address
* @param mem
* @param *var
* @return ÎÞ·µ»ØÖµ
* @return ,
* @note 使WriteCoilsVar
*/
void bsp_ModBus_Tx::WriteCoils(u16 address, u16 mem, u8* var) {
u16 bsp_ModBus_Tx::WriteCoils(u16 address, u16 mem, u8* var) {
u8 bytes = (mem / 8) + (mem % 8 != 0) + 9;
u8* dat = (u8*)malloc(bytes);
if (dat == NULL)return;
if (dat == NULL)return 0;
u16 crc;
dat[0] = ID;
dat[1] = Fun_W_Coils;
@@ -255,7 +263,8 @@ void bsp_ModBus_Tx::WriteCoils(u16 address, u16 mem, u8* var) {
dat[bytes - 2] = ((u8*)(&crc))[0];
dat[bytes - 1] = ((u8*)(&crc))[1];
Transmit(dat, bytes);
free(dat);}
free(dat);
return 9;}
//----------------------------------------------------------------------------------------------------
/**
* @brief 线
@@ -263,16 +272,16 @@ void bsp_ModBus_Tx::WriteCoils(u16 address, u16 mem, u8* var) {
* @param mem
* @param var
* mem的数量决定此处数量
* @return ÎÞ·µ»ØÖµ
* @return ,
*/
void bsp_ModBus_Tx::WriteCoilsVar(u16 address, u16 mem,...) {
u16 bsp_ModBus_Tx::WriteCoilsVar(u16 address, u16 mem,...) {
va_list table;
va_start(table,mem);
u8 var=0;
u16 crc;
u8 bytes = (mem / 8) + (mem % 8 != 0) + 9;
u8* dat = (u8*)malloc(bytes);
if (dat == NULL)return;
if (dat == NULL)return 0;
dat[0] = ID;
dat[1] = Fun_W_Coils;
dat[2] = ((u8*)(&address))[1];
@@ -292,7 +301,8 @@ void bsp_ModBus_Tx::WriteCoilsVar(u16 address, u16 mem,...) {
dat[bytes - 1] = ((u8*)(&crc))[1];
Transmit(dat, bytes);
free(dat);
va_end(table);}
va_end(table);
return 9;}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类函数
@@ -301,7 +311,8 @@ void bsp_ModBus_Tx::WriteCoilsVar(u16 address, u16 mem,...) {
* @param *dat
* @return
*/
void bsp_ModBus_Rx::analysis(u8* dat) {
u8 bsp_ModBus_Rx::analysis(u8* dat) {
u16 crc = 0;
ID = dat[0];
Func = dat[1];
@@ -316,8 +327,9 @@ void bsp_ModBus_Rx::analysis(u8* dat) {
Func == Fun_R_KeepReg ||
Func == Fun_R_InReg) {
crc = CRC16_MODBUS(dat, dat[2] + 3);
crcts = ( ((u8*)(&crc))[1] == dat[dat[2] + 3] &&
((u8*)(&crc))[0] == dat[dat[2] + 4]);}
crcres = ( ((u8*)(&crc))[0] != dat[dat[2] + 3] ||
((u8*)(&crc))[1] != dat[dat[2] + 4]);}
// 开始解析
switch (Func) {
case Fun_R_OutCoil:
// 输出线圈
@@ -355,7 +367,8 @@ void bsp_ModBus_Rx::analysis(u8* dat) {
break;
default:
// 写回显与其他
break;}}
break;}
return crcres;}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 构造函数

View File

@@ -22,7 +22,7 @@
*/
/**
* @file bsp_ModBus.h
* @file bsp_ModBus.cpp
* @brief ModBus通信函数
* @mainpage
* @author Yuankang Liang(XerolySkinner)
@@ -31,6 +31,7 @@
* @date 2022-11-21 17:09
*/
#pragma once
#include "User.h"
#include "varint.h"
#include "usart.h"
#include <stdarg.h>
@@ -59,17 +60,17 @@ class bsp_ModBus_Tx{
public:
bsp_ModBus_Tx(u8 ID);
public:
void ReadKeepReg(u16 address,u16 mem);
void ReadInReg(u16 address, u16 mem);
void WriteOneReg(u16 address, u16 var);
void WriteRegs(u16 address, u16 mem, u16* var);
void WriteRegsVar(u16 address, u16 mem,...);
u16 ReadKeepReg(u16 address,u16 mem);
u16 ReadInReg(u16 address, u16 mem);
u16 WriteOneReg(u16 address, u16 var);
u16 WriteRegs(u16 address, u16 mem, u16* var);
u16 WriteRegsVar(u16 address, u16 mem,...);
void ReadOutCoil(u16 address,u16 mem);
void ReadInCoil(u16 address, u16 mem);
void WriteOneCoil(u16 address, u16 state);
void WriteCoils(u16 address, u16 mem, u8* var);
void WriteCoilsVar(u16 address, u16 mem,...);
u16 ReadOutCoil(u16 address,u16 mem);
u16 ReadInCoil(u16 address, u16 mem);
u16 WriteOneCoil(u16 address, u16 state);
u16 WriteCoils(u16 address, u16 mem, u8* var);
u16 WriteCoilsVar(u16 address, u16 mem,...);
protected:
virtual void Transmit(u8 *dat, u16 len)=0;
protected:
@@ -84,11 +85,11 @@ class bsp_ModBus_Rx{
bsp_ModBus_Rx(void);
~bsp_ModBus_Rx(void);
public:
void analysis(u8* dat);
u8 analysis(u8* dat);
// 共有变量
u8 ID; ///< 器件ID
u8 Func; ///< 功能号
u8 crcts; ///< CRC²âÊÔ
u8 crcres;
// 保持寄存器特有
u16 *KeepRegDat;
u8 KeepRegMem;
@@ -102,4 +103,25 @@ class bsp_ModBus_Rx{
u8* InCoilDat;
u8 InCoilMem;};
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// bspÊÊÅä
#ifdef _STM32_HAL_
/**
* @brief STM32Óô®¿ÚµÄModBus·¢ËÍÆ÷
*/
class bsp_ModBus_STM32_TX:public bsp_ModBus_Tx {
public:
bsp_ModBus_STM32_TX(UART_HandleTypeDef* huart,u8 ID,uint32_t Timeout):bsp_ModBus_Tx(ID){
bsp_ModBus_STM32_TX::huart = huart;
bsp_ModBus_STM32_TX::Timeout = Timeout;}
protected:
virtual void Transmit(u8 *dat, u16 len){
HAL_UART_Transmit(huart,dat,len,Timeout);}
private:
UART_HandleTypeDef* huart;
uint32_t Timeout;};
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -0,0 +1,74 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_PrintArt.cpp
* @brief print重定向的艺术
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-27 02:15
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类声明
#include "bsp_PrintArt.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类函数
/**
* @brief 重定向后的发射数据
* @param format 格式化的字符串
* @param ... 其参数
* @return 成功与否
*/
int bsp_PrintArt::print(const char* format, ...) {
u8* dat = (u8*)malloc(Bufflen); // 分配内存
if(dat==NULL)return 1; // 判断分配成功与否
u32 res; // 返回状态码
va_list args; // 不定长变量
va_start(args, format); // 初始化不定长变量
res=vsprintf((char*)dat,(const char*)format, args); // 组合
Transmit(dat, strlen((const char*)dat)); // 发送
va_end(args); // 收尸
free(dat); // 回收内存
return res;}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 构造函数
bsp_PrintArt::bsp_PrintArt(void) {
Bufflen = 128;}
/**
* @brief 重定向后的发射数据
* @param len 缓冲区大小
*/
bsp_PrintArt::bsp_PrintArt(u32 len) {
Bufflen = len;}
//----------------------------------------------------------------------------------------------------
bsp_PrintArt_STM32::bsp_PrintArt_STM32(UART_HandleTypeDef *huart,u32 Bufflen):bsp_PrintArt(Bufflen){
bsp_PrintArt_STM32::huart=huart;}
//----------------------------------------------------------------------------------------------------
bsp_PrintArt_STM32::bsp_PrintArt_STM32(UART_HandleTypeDef *huart):bsp_PrintArt(){
bsp_PrintArt_STM32::huart=huart;}
//////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -22,21 +22,56 @@
*/
/**
* @file bsp_ModBus_STM32.cpp
* @brief ModBus通信基于STM32
* @file bsp_PrintArt.h
* @brief print重定向的艺术
* @mainpage Ö÷ÒªÐÅÏ¢
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-22 01:28
* @date 2022-11-27 02:15
*/
#pragma once
#ifdef __cplusplus
#include "User.h"
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include "varint.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 头文件
#include "bsp_ModBus_STM32.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 函数
//////////////////////////////////////////////////////////////////////////////////////////////////////
// 类声明
/**
* @brief print的重定向对象
*/
class bsp_PrintArt{
public:
bsp_PrintArt(void);
bsp_PrintArt(u32 len);
int print(const char* format, ...);
private:
u32 Bufflen;
virtual void Transmit(u8* dat, u32 len) = 0;};
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// bsp适配
#ifdef _STM32_HAL_
#include "usart.h"
/**
* @brief print的重定向对象
*/
class bsp_PrintArt_STM32:public bsp_PrintArt{
public:
bsp_PrintArt_STM32(UART_HandleTypeDef *huart,u32 Bufflen);
bsp_PrintArt_STM32(UART_HandleTypeDef *huart);
private:
UART_HandleTypeDef *huart;
virtual void Transmit(u8* dat, u32 len){
HAL_UART_Transmit(huart,dat,len,0xFF);
}};
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -0,0 +1,425 @@
;*******************************************************************************
;* @File Name : startup_stm32g431xx.s
;* @Author : MCD Application Team
;* @Brief : Vector table for MDK-ARM toolchain
;*******************************************************************************
;* Description : STM32G431xx Mainstream devices vector table for
;* MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the Cortex-M4 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;********************************************************************************
;* @attention
;*
;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
;* All rights reserved.</center></h2>
;*
;* This software component is licensed by ST under BSD 3-Clause license,
;* the "License"; You may not use this file except in compliance with the
;* License. You may obtain a copy of the License at:
;* opensource.org/licenses/BSD-3-Clause
;*
;*******************************************************************************
;* <<< Use Configuration Wizard in Context Menu >>>
;
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window WatchDog
DCD PVD_PVM_IRQHandler ; PVD/PVM1/PVM2/PVM3/PVM4 through EXTI Line detection
DCD RTC_TAMP_LSECSS_IRQHandler ; RTC, TAMP and RCC LSE_CSS through the EXTI line
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_IRQHandler ; EXTI Line2
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD 0 ; Reserved
DCD ADC1_2_IRQHandler ; ADC1 and ADC2
DCD USB_HP_IRQHandler ; USB Device High Priority
DCD USB_LP_IRQHandler ; USB Device Low Priority
DCD FDCAN1_IT0_IRQHandler ; FDCAN1 interrupt line 0
DCD FDCAN1_IT1_IRQHandler ; FDCAN1 interrupt line 1
DCD EXTI9_5_IRQHandler ; External Line[9:5]s
DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break, Transition error, Index error and TIM15
DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16
DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger, Commutation, Direction change, Index and TIM17
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; External Line[15:10]
DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup through EXTI line
DCD TIM8_BRK_IRQHandler ; TIM8 Break, Transition error and Index error Interrupt
DCD TIM8_UP_IRQHandler ; TIM8 Update Interrupt
DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger, Commutation, Direction change and Index Interrupt
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare Interrupt
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD LPTIM1_IRQHandler ; LP TIM1 interrupt
DCD 0 ; Reserved
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD 0 ; Reserved
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&3 underrun errors
DCD TIM7_DAC_IRQHandler ; TIM7 and DAC2&4 underrun errors
DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1
DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2
DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3
DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4
DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD UCPD1_IRQHandler ; UCPD1
DCD COMP1_2_3_IRQHandler ; COMP1, COMP2 and COMP3
DCD COMP4_IRQHandler ; COMP4
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD CRS_IRQHandler ; CRS Interrupt
DCD SAI1_IRQHandler ; Serial Audio Interface 1 global interrupt
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD FPU_IRQHandler ; FPU
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD RNG_IRQHandler ; RNG global interrupt
DCD LPUART1_IRQHandler ; LP UART 1 interrupt
DCD I2C3_EV_IRQHandler ; I2C3 Event
DCD I2C3_ER_IRQHandler ; I2C3 Error
DCD DMAMUX_OVR_IRQHandler ; DMAMUX overrun global interrupt
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD CORDIC_IRQHandler ; CORDIC
DCD FMAC_IRQHandler ; FMAC
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_PVM_IRQHandler [WEAK]
EXPORT RTC_TAMP_LSECSS_IRQHandler [WEAK]
EXPORT RTC_WKUP_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT ADC1_2_IRQHandler [WEAK]
EXPORT USB_HP_IRQHandler [WEAK]
EXPORT USB_LP_IRQHandler [WEAK]
EXPORT FDCAN1_IT0_IRQHandler [WEAK]
EXPORT FDCAN1_IT1_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK]
EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTC_Alarm_IRQHandler [WEAK]
EXPORT USBWakeUp_IRQHandler [WEAK]
EXPORT TIM8_BRK_IRQHandler [WEAK]
EXPORT TIM8_UP_IRQHandler [WEAK]
EXPORT TIM8_TRG_COM_IRQHandler [WEAK]
EXPORT TIM8_CC_IRQHandler [WEAK]
EXPORT LPTIM1_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT TIM6_DAC_IRQHandler [WEAK]
EXPORT TIM7_DAC_IRQHandler [WEAK]
EXPORT DMA2_Channel1_IRQHandler [WEAK]
EXPORT DMA2_Channel2_IRQHandler [WEAK]
EXPORT DMA2_Channel3_IRQHandler [WEAK]
EXPORT DMA2_Channel4_IRQHandler [WEAK]
EXPORT DMA2_Channel5_IRQHandler [WEAK]
EXPORT UCPD1_IRQHandler [WEAK]
EXPORT COMP1_2_3_IRQHandler [WEAK]
EXPORT COMP4_IRQHandler [WEAK]
EXPORT CRS_IRQHandler [WEAK]
EXPORT SAI1_IRQHandler [WEAK]
EXPORT FPU_IRQHandler [WEAK]
EXPORT RNG_IRQHandler [WEAK]
EXPORT LPUART1_IRQHandler [WEAK]
EXPORT I2C3_EV_IRQHandler [WEAK]
EXPORT I2C3_ER_IRQHandler [WEAK]
EXPORT DMAMUX_OVR_IRQHandler [WEAK]
EXPORT DMA2_Channel6_IRQHandler [WEAK]
EXPORT CORDIC_IRQHandler [WEAK]
EXPORT FMAC_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_PVM_IRQHandler
RTC_TAMP_LSECSS_IRQHandler
RTC_WKUP_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
ADC1_2_IRQHandler
USB_HP_IRQHandler
USB_LP_IRQHandler
FDCAN1_IT0_IRQHandler
FDCAN1_IT1_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_TIM15_IRQHandler
TIM1_UP_TIM16_IRQHandler
TIM1_TRG_COM_TIM17_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTC_Alarm_IRQHandler
USBWakeUp_IRQHandler
TIM8_BRK_IRQHandler
TIM8_UP_IRQHandler
TIM8_TRG_COM_IRQHandler
TIM8_CC_IRQHandler
LPTIM1_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
TIM6_DAC_IRQHandler
TIM7_DAC_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_IRQHandler
DMA2_Channel5_IRQHandler
UCPD1_IRQHandler
COMP1_2_3_IRQHandler
COMP4_IRQHandler
CRS_IRQHandler
SAI1_IRQHandler
FPU_IRQHandler
RNG_IRQHandler
LPUART1_IRQHandler
I2C3_EV_IRQHandler
I2C3_ER_IRQHandler
DMAMUX_OVR_IRQHandler
DMA2_Channel6_IRQHandler
CORDIC_IRQHandler
FMAC_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****

View File

@@ -1,85 +0,0 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file varint.h
* @brief 全局共用的标准类型表
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-07 18:50
*/
#pragma once
#include "stdint.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 程序
//
typedef uint8_t u8; ///< 8位无符号数类型
typedef uint16_t u16; ///< 16位无符号数类型
typedef uint32_t u32; ///< 32位无符号数类型
typedef uint64_t u64; ///< 64位无符号数类型
typedef int8_t i8; ///< 8位有符号数类型
typedef int16_t i16; ///< 16位有符号数类型
typedef int32_t i32; ///< 32位有符号数类型
typedef int64_t i64; ///< 64位有符号数类型
typedef volatile u8 vu8; ///< 8位无符号易变类型
typedef volatile u16 vu16; ///< 16位无符号易变类型
typedef volatile u32 vu32; ///< 32位无符号易变类型
typedef volatile u64 vu64; ///< 64位无符号易变类型
typedef volatile i8 vi8; ///< 8位有符号易变类型
typedef volatile i16 vi16; ///< 16位有符号易变类型
typedef volatile i32 vi32; ///< 32位有符号易变类型
typedef volatile i64 vi64; ///< 64位有符号易变类型
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 位宏
#define P8(x) ((u8*)(&(x))) ///< 强制转换变成u8的指针
#define Pn8(x,y) (((u8*)(&(x)))[y]) ///< 强制转换变成u8的数组
#define P16(x) ((u16*)(&(x))) ///< 强制转换变成u16的指针
#define Pn16(x,y) (((u16*)(&(x)))[y]) ///< 强制转换变成u16的数组
#define P32(x) ((u32*)(&(x))) ///< 强制转换变成u32的指针
#define Pn32(x,y) (((u32*)(&(x)))[y]) ///< 强制转换变成u32的数组
#define DelLb(x) (x & (x - 1)) ///< 移除最低位的1
#define qDelLb(x) (x=(x & (x - 1))) ///< 移除并保存最低位的1
#define toBool(x) (x!=0) ///< 数布尔化
#define uBit(x,y) (x&(1<<y)) ///< 挑选某一位
#define tBit(x,y) (toBool(uBit(x,y))) ///< 挑选某一位并且布尔化
#define sBit(x,y) (x|(1<<y)) ///< 置高某一位
#define rBit(x,y) (x&(~(1<<y))) ///< 拉低某一位
#define mBit(x,y,z) ((z)?sBit(x,y):rBit(x,y)) ///< 选择性拉高拉低某一位
#define LpAdd(x,y) ((x+1)<y?x+1:0) ///< 带最高限制的加法
#define LpDec(x,y) (x>0?x-1:y-1) ///< 带最低限制的减法
#define qLpAdd(x,y) (x=(x+1)<y?x+1:0) ///< 带最高限制的自增
#define qLpDec(x,y) (x=x>0?x-1:y-1) ///< 带最低限制的自减
//////////////////////////////////////////////////////////////////////////////////////////////////////