Compare commits
3
Commits
af9563b90f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb44ccc19e | ||
|
|
ef3601f9e8 | ||
|
|
2d25f6bb06 |
+32
-6
@@ -1,5 +1,4 @@
|
||||
#include "STC8_SDCC.H"
|
||||
#include <string.h>
|
||||
|
||||
/* ========================================================================
|
||||
* 系统常量
|
||||
@@ -29,11 +28,43 @@
|
||||
#define NRF_BINDING 1 /* 3Hz - 对频中 */
|
||||
#define CONNECTED 2 /* 常亮 - 已连接 */
|
||||
#define NRF_ERROR 4 /* 双闪 - NRF硬件错误 */
|
||||
/* UART运行模式 */
|
||||
#define UART_CMD 0
|
||||
#define UART_SBUS 1
|
||||
#define UART_CRSF 2
|
||||
|
||||
/* ========================================================================
|
||||
* 全局变量
|
||||
* ======================================================================== */
|
||||
|
||||
// 配置信息
|
||||
struct CONFIG
|
||||
{
|
||||
// 运行模式
|
||||
uint8 RunMode;
|
||||
// nrf24使用的通道
|
||||
uint8 NrfCH;
|
||||
// nrf24使用的对频短语
|
||||
uint8 BindPhr[6];
|
||||
// nrf24地址,40位
|
||||
uint8 RxAddr[5];
|
||||
// 对频标志
|
||||
uint8 BindMagic;
|
||||
// 记录的发射机地址
|
||||
uint8 TxAddr[5];
|
||||
// 回传频率
|
||||
uint8 TelemRate;
|
||||
} Config;
|
||||
|
||||
// nrf24l01接收的数据
|
||||
struct RFDATA
|
||||
{
|
||||
// nrf24l01一次性接收32byte数据
|
||||
uint8 RefreshRate;
|
||||
uint16 CH[15];
|
||||
uint8 end;
|
||||
} RF_Data;
|
||||
|
||||
// 系统滴答定时器计数 (用于LED闪烁)
|
||||
static uint8 sys_tick = 0;
|
||||
|
||||
@@ -68,11 +99,6 @@ static uint8_t telem_rate_hz = 2; /* 回传频率 1-10Hz, 默认2Hz */
|
||||
static uint8_t __xdata crfs_forward_buf[24];
|
||||
static uint8_t crfs_forward_len = 0;
|
||||
|
||||
/* UART 接收缓冲 (放在 xdata) */
|
||||
static uint8_t __xdata uart_rx_buf[UART_BUF_SIZE];
|
||||
static uint8_t uart_rx_idx = 0;
|
||||
static volatile uint8_t uart_cmd_ready = 0;
|
||||
|
||||
/* 定时器计数 (用于LED闪烁) */
|
||||
static volatile uint16_t sys_tick = 0;
|
||||
|
||||
|
||||
@@ -23,11 +23,17 @@
|
||||
#include "nrf24.h"
|
||||
#include "uart.h"
|
||||
|
||||
void LoadConfig();
|
||||
void SystemInit();
|
||||
void PWMBInit();
|
||||
// EEPROM操作
|
||||
static CONFIG IAP_Read();
|
||||
static void IAP_Write(uint8 addr, CONFIG dat);
|
||||
static void IAP_Erase(uint8 addr);
|
||||
|
||||
void main(void) {
|
||||
static void LoadConfig();
|
||||
static void SystemInit();
|
||||
static void PWMBInit();
|
||||
static void UpdatePWMB();
|
||||
|
||||
static void main(void) {
|
||||
/* 系统初始化 */
|
||||
SystemInit();
|
||||
PWMBInit();
|
||||
@@ -150,6 +156,12 @@ void SystemInit() {
|
||||
SPSTAT = 0xC0;
|
||||
// 3. (可选) 使能SPI中断
|
||||
// IE2 |= ESPI;
|
||||
|
||||
// ADC_Init()
|
||||
ADCCFG = ADC_RESFMT; /* 右对齐, 12位结果 */
|
||||
ADC_CONTR = ADC_POWER; /* 开启ADC电源 */
|
||||
/* 选择通道11 (P3.3) */
|
||||
ADC_CONTR = (ADC_CONTR & 0xF0) | 0x0B;
|
||||
}
|
||||
void PWMBInit() {
|
||||
// 1. 使能访问扩展特殊功能寄存器 (XFR)
|
||||
@@ -230,7 +242,6 @@ void Servo_SetAngle(uint16 CH_Value[4]) {
|
||||
PWMB_CCR7 = CH_Value[2]*2-1500;
|
||||
PWMB_CCR8 = CH_Value[3]*2-1500;
|
||||
}
|
||||
|
||||
// 中断
|
||||
void tm0_isr(void) __interrupt(1) {
|
||||
// 40MHz系统下10us中断, 用于系统滴答
|
||||
@@ -241,3 +252,11 @@ void tm0_isr(void) __interrupt(1) {
|
||||
if (sys_tick++ >= 1000) sys_tick = 0; // 1秒清零
|
||||
}
|
||||
}
|
||||
|
||||
static CONFIG IAP_Read(){
|
||||
static __xdata CONFIG dat;
|
||||
|
||||
return dat;
|
||||
}
|
||||
static void IAP_Write(uint8 addr, CONFIG dat);
|
||||
static void IAP_Erase(uint8 addr);
|
||||
-590
@@ -1,590 +0,0 @@
|
||||
#ifndef __STC8F_H_
|
||||
#define __STC8F_H_
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
|
||||
//包含本头文件后,不用另外再包含"REG51.H"
|
||||
|
||||
//内核特殊功能寄存器
|
||||
sfr ACC = 0xe0;
|
||||
sfr B = 0xf0;
|
||||
sfr PSW = 0xd0;
|
||||
sbit CY = PSW^7;
|
||||
sbit AC = PSW^6;
|
||||
sbit F0 = PSW^5;
|
||||
sbit RS1 = PSW^4;
|
||||
sbit RS0 = PSW^3;
|
||||
sbit OV = PSW^2;
|
||||
sbit P = PSW^0;
|
||||
sfr SP = 0x81;
|
||||
sfr DPL = 0x82;
|
||||
sfr DPH = 0x83;
|
||||
sfr TA = 0xae;
|
||||
sfr DPS = 0xe3;
|
||||
sfr DPL1 = 0xe4;
|
||||
sfr DPH1 = 0xe5;
|
||||
|
||||
|
||||
//I/O 口特殊功能寄存器
|
||||
sfr P0 = 0x80;
|
||||
sfr P1 = 0x90;
|
||||
sfr P2 = 0xa0;
|
||||
sfr P3 = 0xb0;
|
||||
sfr P4 = 0xc0;
|
||||
sfr P5 = 0xc8;
|
||||
sfr P6 = 0xe8;
|
||||
sfr P7 = 0xf8;
|
||||
sfr P0M0 = 0x94;
|
||||
sfr P0M1 = 0x93;
|
||||
sfr P1M0 = 0x92;
|
||||
sfr P1M1 = 0x91;
|
||||
sfr P2M0 = 0x96;
|
||||
sfr P2M1 = 0x95;
|
||||
sfr P3M0 = 0xb2;
|
||||
sfr P3M1 = 0xb1;
|
||||
sfr P4M0 = 0xb4;
|
||||
sfr P4M1 = 0xb3;
|
||||
sfr P5M0 = 0xca;
|
||||
sfr P5M1 = 0xc9;
|
||||
sfr P6M0 = 0xcc;
|
||||
sfr P6M1 = 0xcb;
|
||||
sfr P7M0 = 0xe2;
|
||||
sfr P7M1 = 0xe1;
|
||||
|
||||
sbit P00 = P0^0;
|
||||
sbit P01 = P0^1;
|
||||
sbit P02 = P0^2;
|
||||
sbit P03 = P0^3;
|
||||
sbit P04 = P0^4;
|
||||
sbit P05 = P0^5;
|
||||
sbit P06 = P0^6;
|
||||
sbit P07 = P0^7;
|
||||
sbit P10 = P1^0;
|
||||
sbit P11 = P1^1;
|
||||
sbit P12 = P1^2;
|
||||
sbit P13 = P1^3;
|
||||
sbit P14 = P1^4;
|
||||
sbit P15 = P1^5;
|
||||
sbit P16 = P1^6;
|
||||
sbit P17 = P1^7;
|
||||
sbit P20 = P2^0;
|
||||
sbit P21 = P2^1;
|
||||
sbit P22 = P2^2;
|
||||
sbit P23 = P2^3;
|
||||
sbit P24 = P2^4;
|
||||
sbit P25 = P2^5;
|
||||
sbit P26 = P2^6;
|
||||
sbit P27 = P2^7;
|
||||
sbit P30 = P3^0;
|
||||
sbit P31 = P3^1;
|
||||
sbit P32 = P3^2;
|
||||
sbit P33 = P3^3;
|
||||
sbit P34 = P3^4;
|
||||
sbit P35 = P3^5;
|
||||
sbit P36 = P3^6;
|
||||
sbit P37 = P3^7;
|
||||
sbit P40 = P4^0;
|
||||
sbit P41 = P4^1;
|
||||
sbit P42 = P4^2;
|
||||
sbit P43 = P4^3;
|
||||
sbit P44 = P4^4;
|
||||
sbit P45 = P4^5;
|
||||
sbit P46 = P4^6;
|
||||
sbit P47 = P4^7;
|
||||
sbit P50 = P5^0;
|
||||
sbit P51 = P5^1;
|
||||
sbit P52 = P5^2;
|
||||
sbit P53 = P5^3;
|
||||
sbit P54 = P5^4;
|
||||
sbit P55 = P5^5;
|
||||
sbit P56 = P5^6;
|
||||
sbit P57 = P5^7;
|
||||
sbit P60 = P6^0;
|
||||
sbit P61 = P6^1;
|
||||
sbit P62 = P6^2;
|
||||
sbit P63 = P6^3;
|
||||
sbit P64 = P6^4;
|
||||
sbit P65 = P6^5;
|
||||
sbit P66 = P6^6;
|
||||
sbit P67 = P6^7;
|
||||
sbit P70 = P7^0;
|
||||
sbit P71 = P7^1;
|
||||
sbit P72 = P7^2;
|
||||
sbit P73 = P7^3;
|
||||
sbit P74 = P7^4;
|
||||
sbit P75 = P7^5;
|
||||
sbit P76 = P7^6;
|
||||
sbit P77 = P7^7;
|
||||
|
||||
//如下特殊功能寄存器位于扩展RAM区域
|
||||
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
|
||||
#define P0PU (*(unsigned char volatile xdata *)0xfe10)
|
||||
#define P1PU (*(unsigned char volatile xdata *)0xfe11)
|
||||
#define P2PU (*(unsigned char volatile xdata *)0xfe12)
|
||||
#define P3PU (*(unsigned char volatile xdata *)0xfe13)
|
||||
#define P4PU (*(unsigned char volatile xdata *)0xfe14)
|
||||
#define P5PU (*(unsigned char volatile xdata *)0xfe15)
|
||||
#define P6PU (*(unsigned char volatile xdata *)0xfe16)
|
||||
#define P7PU (*(unsigned char volatile xdata *)0xfe17)
|
||||
#define P0NCS (*(unsigned char volatile xdata *)0xfe18)
|
||||
#define P1NCS (*(unsigned char volatile xdata *)0xfe19)
|
||||
#define P2NCS (*(unsigned char volatile xdata *)0xfe1a)
|
||||
#define P3NCS (*(unsigned char volatile xdata *)0xfe1b)
|
||||
#define P4NCS (*(unsigned char volatile xdata *)0xfe1c)
|
||||
#define P5NCS (*(unsigned char volatile xdata *)0xfe1d)
|
||||
#define P6NCS (*(unsigned char volatile xdata *)0xfe1e)
|
||||
#define P7NCS (*(unsigned char volatile xdata *)0xfe1f)
|
||||
|
||||
//系统管理特殊功能寄存器
|
||||
sfr PCON = 0x87;
|
||||
#define SMOD 0x80
|
||||
#define SMOD0 0x40
|
||||
#define LVDF 0x20
|
||||
#define POF 0x10
|
||||
#define GF1 0x08
|
||||
#define GF0 0x04
|
||||
#define PD 0x02
|
||||
#define IDL 0x01
|
||||
sfr AUXR = 0x8e;
|
||||
#define T0x12 0x80
|
||||
#define T1x12 0x40
|
||||
#define UART_M0x6 0x20
|
||||
#define T2R 0x10
|
||||
#define T2_CT 0x08
|
||||
#define T2x12 0x04
|
||||
#define EXTRAM 0x02
|
||||
#define S1ST2 0x01
|
||||
sfr AUXR2 = 0x97;
|
||||
#define TXLNRX 0x10
|
||||
sfr BUS_SPEED = 0xa1;
|
||||
sfr P_SW1 = 0xa2;
|
||||
sfr P_SW2 = 0xba;
|
||||
#define EAXFR 0x80
|
||||
sfr VOCTRL = 0xbb;
|
||||
sfr RSTCFG = 0xff;
|
||||
|
||||
//如下特殊功能寄存器位于扩展RAM区域
|
||||
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
|
||||
#define CKSEL (*(unsigned char volatile xdata *)0xfe00)
|
||||
#define CLKDIV (*(unsigned char volatile xdata *)0xfe01)
|
||||
#define IRC24MCR (*(unsigned char volatile xdata *)0xfe02)
|
||||
#define XOSCCR (*(unsigned char volatile xdata *)0xfe03)
|
||||
#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04)
|
||||
|
||||
//中断特殊功能寄存器
|
||||
sfr IE = 0xa8;
|
||||
sbit EA = IE^7;
|
||||
sbit ELVD = IE^6;
|
||||
sbit EADC = IE^5;
|
||||
sbit ES = IE^4;
|
||||
sbit ET1 = IE^3;
|
||||
sbit EX1 = IE^2;
|
||||
sbit ET0 = IE^1;
|
||||
sbit EX0 = IE^0;
|
||||
sfr IE2 = 0xaf;
|
||||
#define ET4 0x40
|
||||
#define ET3 0x20
|
||||
#define ES4 0x10
|
||||
#define ES3 0x08
|
||||
#define ET2 0x04
|
||||
#define ESPI 0x02
|
||||
#define ES2 0x01
|
||||
sfr IP = 0xb8;
|
||||
sbit PPCA = IP^7;
|
||||
sbit PLVD = IP^6;
|
||||
sbit PADC = IP^5;
|
||||
sbit PS = IP^4;
|
||||
sbit PT1 = IP^3;
|
||||
sbit PX1 = IP^2;
|
||||
sbit PT0 = IP^1;
|
||||
sbit PX0 = IP^0;
|
||||
sfr IP2 = 0xb5;
|
||||
#define PI2C 0x40
|
||||
#define PCMP 0x20
|
||||
#define PX4 0x10
|
||||
#define PPWMFD 0x08
|
||||
#define PPWM 0x04
|
||||
#define PSPI 0x02
|
||||
#define PS2 0x01
|
||||
sfr IPH = 0xb7;
|
||||
#define PPCAH 0x80
|
||||
#define PLVDH 0x40
|
||||
#define PADCH 0x20
|
||||
#define PSH 0x10
|
||||
#define PT1H 0x08
|
||||
#define PX1H 0x04
|
||||
#define PT0H 0x02
|
||||
#define PX0H 0x01
|
||||
sfr IP2H = 0xb6;
|
||||
#define PI2CH 0x40
|
||||
#define PCMPH 0x20
|
||||
#define PX4H 0x10
|
||||
#define PPWMFDH 0x08
|
||||
#define PPWMH 0x04
|
||||
#define PSPIH 0x02
|
||||
#define PS2H 0x01
|
||||
sfr INTCLKO = 0x8f;
|
||||
#define EX4 0x40
|
||||
#define EX3 0x20
|
||||
#define EX2 0x10
|
||||
#define T2CLKO 0x04
|
||||
#define T1CLKO 0x02
|
||||
#define T0CLKO 0x01
|
||||
sfr AUXINTIF = 0xef;
|
||||
#define INT4IF 0x40
|
||||
#define INT3IF 0x20
|
||||
#define INT2IF 0x10
|
||||
#define T4IF 0x04
|
||||
#define T3IF 0x02
|
||||
#define T2IF 0x01
|
||||
|
||||
//定时器特殊功能寄存器
|
||||
sfr TCON = 0x88;
|
||||
sbit TF1 = TCON^7;
|
||||
sbit TR1 = TCON^6;
|
||||
sbit TF0 = TCON^5;
|
||||
sbit TR0 = TCON^4;
|
||||
sbit IE1 = TCON^3;
|
||||
sbit IT1 = TCON^2;
|
||||
sbit IE0 = TCON^1;
|
||||
sbit IT0 = TCON^0;
|
||||
sfr TMOD = 0x89;
|
||||
#define T1_GATE 0x80
|
||||
#define T1_CT 0x40
|
||||
#define T1_M1 0x20
|
||||
#define T1_M0 0x10
|
||||
#define T0_GATE 0x08
|
||||
#define T0_CT 0x04
|
||||
#define T0_M1 0x02
|
||||
#define T0_M0 0x01
|
||||
sfr TL0 = 0x8a;
|
||||
sfr TL1 = 0x8b;
|
||||
sfr TH0 = 0x8c;
|
||||
sfr TH1 = 0x8d;
|
||||
sfr T4T3M = 0xd1;
|
||||
#define T4R 0x80
|
||||
#define T4_CT 0x40
|
||||
#define T4x12 0x20
|
||||
#define T4CLKO 0x10
|
||||
#define T3R 0x08
|
||||
#define T3_CT 0x04
|
||||
#define T3x12 0x02
|
||||
#define T3CLKO 0x01
|
||||
sfr T4H = 0xd2;
|
||||
sfr T4L = 0xd3;
|
||||
sfr T3H = 0xd4;
|
||||
sfr T3L = 0xd5;
|
||||
sfr T2H = 0xd6;
|
||||
sfr T2L = 0xd7;
|
||||
sfr TH4 = 0xd2;
|
||||
sfr TL4 = 0xd3;
|
||||
sfr TH3 = 0xd4;
|
||||
sfr TL3 = 0xd5;
|
||||
sfr TH2 = 0xd6;
|
||||
sfr TL2 = 0xd7;
|
||||
sfr WKTCL = 0xaa;
|
||||
sfr WKTCH = 0xab;
|
||||
#define WKTEN 0x80
|
||||
sfr WDT_CONTR = 0xc1;
|
||||
#define WDT_FLAG 0x80
|
||||
#define EN_WDT 0x20
|
||||
#define CLR_WDT 0x10
|
||||
#define IDL_WDT 0x08
|
||||
|
||||
//串行口特殊功能寄存器
|
||||
sfr SCON = 0x98;
|
||||
sbit SM0 = SCON^7;
|
||||
sbit SM1 = SCON^6;
|
||||
sbit SM2 = SCON^5;
|
||||
sbit REN = SCON^4;
|
||||
sbit TB8 = SCON^3;
|
||||
sbit RB8 = SCON^2;
|
||||
sbit TI = SCON^1;
|
||||
sbit RI = SCON^0;
|
||||
sfr SBUF = 0x99;
|
||||
sfr S2CON = 0x9a;
|
||||
#define S2SM0 0x80
|
||||
#define S2ST4 0x40
|
||||
#define S2SM2 0x20
|
||||
#define S2REN 0x10
|
||||
#define S2TB8 0x08
|
||||
#define S2RB8 0x04
|
||||
#define S2TI 0x02
|
||||
#define S2RI 0x01
|
||||
sfr S2BUF = 0x9b;
|
||||
sfr S3CON = 0xac;
|
||||
#define S3SM0 0x80
|
||||
#define S3ST4 0x40
|
||||
#define S3SM2 0x20
|
||||
#define S3REN 0x10
|
||||
#define S3TB8 0x08
|
||||
#define S3RB8 0x04
|
||||
#define S3TI 0x02
|
||||
#define S3RI 0x01
|
||||
sfr S3BUF = 0xad;
|
||||
sfr S4CON = 0x84;
|
||||
#define S4SM0 0x80
|
||||
#define S4ST4 0x40
|
||||
#define S4SM2 0x20
|
||||
#define S4REN 0x10
|
||||
#define S4TB8 0x08
|
||||
#define S4RB8 0x04
|
||||
#define S4TI 0x02
|
||||
#define S4RI 0x01
|
||||
sfr S4BUF = 0x85;
|
||||
sfr SADDR = 0xa9;
|
||||
sfr SADEN = 0xb9;
|
||||
|
||||
//ADC 特殊功能寄存器
|
||||
sfr ADC_CONTR = 0xbc;
|
||||
#define ADC_POWER 0x80
|
||||
#define ADC_START 0x40
|
||||
#define ADC_FLAG 0x20
|
||||
sfr ADC_RES = 0xbd;
|
||||
sfr ADC_RESL = 0xbe;
|
||||
sfr ADCCFG = 0xde;
|
||||
#define ADC_RESFMT 0x20
|
||||
|
||||
//SPI 特殊功能寄存器
|
||||
sfr SPSTAT = 0xcd;
|
||||
#define SPIF 0x80
|
||||
#define WCOL 0x40
|
||||
sfr SPCTL = 0xce;
|
||||
#define SSIG 0x80
|
||||
#define SPEN 0x40
|
||||
#define DORD 0x20
|
||||
#define MSTR 0x10
|
||||
#define CPOL 0x08
|
||||
#define CPHA 0x04
|
||||
sfr SPDAT = 0xcf;
|
||||
|
||||
//IAP/ISP 特殊功能寄存器
|
||||
sfr IAP_DATA = 0xc2;
|
||||
sfr IAP_ADDRH = 0xc3;
|
||||
sfr IAP_ADDRL = 0xc4;
|
||||
sfr IAP_CMD = 0xc5;
|
||||
#define IAP_IDL 0x00
|
||||
#define IAP_READ 0x01
|
||||
#define IAP_WRITE 0x02
|
||||
#define IAP_ERASE 0x03
|
||||
sfr IAP_TRIG = 0xc6;
|
||||
sfr IAP_CONTR = 0xc7;
|
||||
#define IAPEN 0x80
|
||||
#define SWBS 0x40
|
||||
#define SWRST 0x20
|
||||
#define CMD_FAIL 0x10
|
||||
sfr ISP_DATA = 0xc2;
|
||||
sfr ISP_ADDRH = 0xc3;
|
||||
sfr ISP_ADDRL = 0xc4;
|
||||
sfr ISP_CMD = 0xc5;
|
||||
sfr ISP_TRIG = 0xc6;
|
||||
sfr ISP_CONTR = 0xc7;
|
||||
|
||||
//比较器特殊功能寄存器
|
||||
sfr CMPCR1 = 0xe6;
|
||||
#define CMPEN 0x80
|
||||
#define CMPIF 0x40
|
||||
#define PIE 0x20
|
||||
#define NIE 0x10
|
||||
#define PIS 0x08
|
||||
#define NIS 0x04
|
||||
#define CMPOE 0x02
|
||||
#define CMPRES 0x01
|
||||
sfr CMPCR2 = 0xe7;
|
||||
#define INVCMPO 0x80
|
||||
#define DISFLT 0x40
|
||||
|
||||
//PCA/PWM 特殊功能寄存器
|
||||
sfr CCON = 0xd8;
|
||||
sbit CF = CCON^7;
|
||||
sbit CR = CCON^6;
|
||||
sbit CCF3 = CCON^3;
|
||||
sbit CCF2 = CCON^2;
|
||||
sbit CCF1 = CCON^1;
|
||||
sbit CCF0 = CCON^0;
|
||||
sfr CMOD = 0xd9;
|
||||
#define CIDL 0x80
|
||||
#define ECF 0x01
|
||||
sfr CL = 0xe9;
|
||||
sfr CH = 0xf9;
|
||||
sfr CCAPM0 = 0xda;
|
||||
#define ECOM0 0x40
|
||||
#define CCAPP0 0x20
|
||||
#define CCAPN0 0x10
|
||||
#define MAT0 0x08
|
||||
#define TOG0 0x04
|
||||
#define PWM0 0x02
|
||||
#define ECCF0 0x01
|
||||
sfr CCAPM1 = 0xdb;
|
||||
#define ECOM1 0x40
|
||||
#define CCAPP1 0x20
|
||||
#define CCAPN1 0x10
|
||||
#define MAT1 0x08
|
||||
#define TOG1 0x04
|
||||
#define PWM1 0x02
|
||||
#define ECCF1 0x01
|
||||
sfr CCAPM2 = 0xdc;
|
||||
#define ECOM2 0x40
|
||||
#define CCAPP2 0x20
|
||||
#define CCAPN2 0x10
|
||||
#define MAT2 0x08
|
||||
#define TOG2 0x04
|
||||
#define PWM2 0x02
|
||||
#define ECCF2 0x01
|
||||
sfr CCAPM3 = 0xdd;
|
||||
#define ECOM3 0x40
|
||||
#define CCAPP3 0x20
|
||||
#define CCAPN3 0x10
|
||||
#define MAT3 0x08
|
||||
#define TOG3 0x04
|
||||
#define PWM3 0x02
|
||||
#define ECCF3 0x01
|
||||
sfr CCAP0L = 0xea;
|
||||
sfr CCAP1L = 0xeb;
|
||||
sfr CCAP2L = 0xec;
|
||||
sfr CCAP3L = 0xed;
|
||||
sfr CCAP0H = 0xfa;
|
||||
sfr CCAP1H = 0xfb;
|
||||
sfr CCAP2H = 0xfc;
|
||||
sfr CCAP3H = 0xfd;
|
||||
sfr PCA_PWM0 = 0xf2;
|
||||
sfr PCA_PWM1 = 0xf3;
|
||||
sfr PCA_PWM2 = 0xf4;
|
||||
sfr PCA_PWM3 = 0xf5;
|
||||
|
||||
//增强型PWM波形发生器特殊功能寄存器
|
||||
sfr PWMCFG = 0xf1;
|
||||
#define CBIF 0x80
|
||||
#define ETADC 0x40
|
||||
sfr PWMIF = 0xf6;
|
||||
#define C7IF 0x80
|
||||
#define C6IF 0x40
|
||||
#define C5IF 0x20
|
||||
#define C4IF 0x10
|
||||
#define C3IF 0x08
|
||||
#define C2IF 0x04
|
||||
#define C1IF 0x02
|
||||
#define C0IF 0x01
|
||||
sfr PWMFDCR = 0xf7;
|
||||
#define INVCMP 0x80
|
||||
#define INVIO 0x40
|
||||
#define ENFD 0x20
|
||||
#define FLTFLIO 0x10
|
||||
#define EFDI 0x08
|
||||
#define FDCMP 0x04
|
||||
#define FDIO 0x02
|
||||
#define FDIF 0x01
|
||||
sfr PWMCR = 0xfe;
|
||||
#define ENPWM 0x80
|
||||
#define ECBI 0x40
|
||||
|
||||
//如下特殊功能寄存器位于扩展RAM区域
|
||||
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
|
||||
#define PWMC (*(unsigned int volatile xdata *)0xfff0)
|
||||
#define PWMCH (*(unsigned char volatile xdata *)0xfff0)
|
||||
#define PWMCL (*(unsigned char volatile xdata *)0xfff1)
|
||||
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
|
||||
#define TADCP (*(unsigned char volatile xdata *)0xfff3)
|
||||
#define TADCPH (*(unsigned char volatile xdata *)0xfff3)
|
||||
#define TADCPL (*(unsigned char volatile xdata *)0xfff4)
|
||||
#define PWM0T1 (*(unsigned int volatile xdata *)0xff00)
|
||||
#define PWM0T1H (*(unsigned char volatile xdata *)0xff00)
|
||||
#define PWM0T1L (*(unsigned char volatile xdata *)0xff01)
|
||||
#define PWM0T2 (*(unsigned int volatile xdata *)0xff02)
|
||||
#define PWM0T2H (*(unsigned char volatile xdata *)0xff02)
|
||||
#define PWM0T2L (*(unsigned char volatile xdata *)0xff03)
|
||||
#define PWM0CR (*(unsigned char volatile xdata *)0xff04)
|
||||
#define PWM0HLD (*(unsigned char volatile xdata *)0xff05)
|
||||
#define PWM1T1 (*(unsigned int volatile xdata *)0xff10)
|
||||
#define PWM1T1H (*(unsigned char volatile xdata *)0xff10)
|
||||
#define PWM1T1L (*(unsigned char volatile xdata *)0xff11)
|
||||
#define PWM1T2 (*(unsigned int volatile xdata *)0xff12)
|
||||
#define PWM1T2H (*(unsigned char volatile xdata *)0xff12)
|
||||
#define PWM1T2L (*(unsigned char volatile xdata *)0xff13)
|
||||
#define PWM1CR (*(unsigned char volatile xdata *)0xff14)
|
||||
#define PWM1HLD (*(unsigned char volatile xdata *)0xff15)
|
||||
#define PWM2T1 (*(unsigned int volatile xdata *)0xff20)
|
||||
#define PWM2T1H (*(unsigned char volatile xdata *)0xff20)
|
||||
#define PWM2T1L (*(unsigned char volatile xdata *)0xff21)
|
||||
#define PWM2T2 (*(unsigned int volatile xdata *)0xff22)
|
||||
#define PWM2T2H (*(unsigned char volatile xdata *)0xff22)
|
||||
#define PWM2T2L (*(unsigned char volatile xdata *)0xff23)
|
||||
#define PWM2CR (*(unsigned char volatile xdata *)0xff24)
|
||||
#define PWM2HLD (*(unsigned char volatile xdata *)0xff25)
|
||||
#define PWM3T1 (*(unsigned int volatile xdata *)0xff30)
|
||||
#define PWM3T1H (*(unsigned char volatile xdata *)0xff30)
|
||||
#define PWM3T1L (*(unsigned char volatile xdata *)0xff31)
|
||||
#define PWM3T2 (*(unsigned int volatile xdata *)0xff32)
|
||||
#define PWM3T2H (*(unsigned char volatile xdata *)0xff32)
|
||||
#define PWM3T2L (*(unsigned char volatile xdata *)0xff33)
|
||||
#define PWM3CR (*(unsigned char volatile xdata *)0xff34)
|
||||
#define PWM3HLD (*(unsigned char volatile xdata *)0xff35)
|
||||
#define PWM4T1 (*(unsigned int volatile xdata *)0xff40)
|
||||
#define PWM4T1H (*(unsigned char volatile xdata *)0xff40)
|
||||
#define PWM4T1L (*(unsigned char volatile xdata *)0xff41)
|
||||
#define PWM4T2 (*(unsigned int volatile xdata *)0xff42)
|
||||
#define PWM4T2H (*(unsigned char volatile xdata *)0xff42)
|
||||
#define PWM4T2L (*(unsigned char volatile xdata *)0xff43)
|
||||
#define PWM4CR (*(unsigned char volatile xdata *)0xff44)
|
||||
#define PWM4HLD (*(unsigned char volatile xdata *)0xff45)
|
||||
#define PWM5T1 (*(unsigned int volatile xdata *)0xff50)
|
||||
#define PWM5T1H (*(unsigned char volatile xdata *)0xff50)
|
||||
#define PWM5T1L (*(unsigned char volatile xdata *)0xff51)
|
||||
#define PWM5T2 (*(unsigned int volatile xdata *)0xff52)
|
||||
#define PWM5T2H (*(unsigned char volatile xdata *)0xff52)
|
||||
#define PWM5T2L (*(unsigned char volatile xdata *)0xff53)
|
||||
#define PWM5CR (*(unsigned char volatile xdata *)0xff54)
|
||||
#define PWM5HLD (*(unsigned char volatile xdata *)0xff55)
|
||||
#define PWM6T1 (*(unsigned int volatile xdata *)0xff60)
|
||||
#define PWM6T1H (*(unsigned char volatile xdata *)0xff60)
|
||||
#define PWM6T1L (*(unsigned char volatile xdata *)0xff61)
|
||||
#define PWM6T2 (*(unsigned int volatile xdata *)0xff62)
|
||||
#define PWM6T2H (*(unsigned char volatile xdata *)0xff62)
|
||||
#define PWM6T2L (*(unsigned char volatile xdata *)0xff63)
|
||||
#define PWM6CR (*(unsigned char volatile xdata *)0xff64)
|
||||
#define PWM6HLD (*(unsigned char volatile xdata *)0xff65)
|
||||
#define PWM7T1 (*(unsigned int volatile xdata *)0xff70)
|
||||
#define PWM7T1H (*(unsigned char volatile xdata *)0xff70)
|
||||
#define PWM7T1L (*(unsigned char volatile xdata *)0xff71)
|
||||
#define PWM7T2 (*(unsigned int volatile xdata *)0xff72)
|
||||
#define PWM7T2H (*(unsigned char volatile xdata *)0xff72)
|
||||
#define PWM7T2L (*(unsigned char volatile xdata *)0xff73)
|
||||
#define PWM7CR (*(unsigned char volatile xdata *)0xff74)
|
||||
#define PWM7HLD (*(unsigned char volatile xdata *)0xff75)
|
||||
|
||||
//I2C特殊功能寄存器
|
||||
//如下特殊功能寄存器位于扩展RAM区域
|
||||
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
|
||||
#define I2CCFG (*(unsigned char volatile xdata *)0xfe80)
|
||||
#define ENI2C 0x80
|
||||
#define MSSL 0x40
|
||||
#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81)
|
||||
#define EMSI 0x80
|
||||
#define I2CMSST (*(unsigned char volatile xdata *)0xfe82)
|
||||
#define MSBUSY 0x80
|
||||
#define MSIF 0x40
|
||||
#define MSACKI 0x02
|
||||
#define MSACKO 0x01
|
||||
#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83)
|
||||
#define ESTAI 0x40
|
||||
#define ERXI 0x20
|
||||
#define ETXI 0x10
|
||||
#define ESTOI 0x08
|
||||
#define SLRST 0x01
|
||||
#define I2CSLST (*(unsigned char volatile xdata *)0xfe84)
|
||||
#define SLBUSY 0x80
|
||||
#define STAIF 0x40
|
||||
#define RXIF 0x20
|
||||
#define TXIF 0x10
|
||||
#define STOIF 0x08
|
||||
#define TXING 0x04
|
||||
#define SLACKI 0x02
|
||||
#define SLACKO 0x01
|
||||
#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85)
|
||||
#define I2CTXD (*(unsigned char volatile xdata *)0xfe86)
|
||||
#define I2CRXD (*(unsigned char volatile xdata *)0xfe87)
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
|
||||
#endif
|
||||
|
||||
-105
@@ -1,105 +0,0 @@
|
||||
/* ========================================================================
|
||||
* IAP/EEPROM 操作
|
||||
* ======================================================================== */
|
||||
|
||||
static void IAP_Init(void) {
|
||||
/* IAP 默认已就绪, 无需额外初始化 */
|
||||
}
|
||||
|
||||
static uint8_t IAP_ReadByte(uint16_t addr) {
|
||||
uint8_t dat;
|
||||
IAP_CONTR = IAPEN; /* 使能IAP */
|
||||
IAP_CMD = IAP_READ;
|
||||
IAP_ADDRH = (uint8_t)(addr >> 8);
|
||||
IAP_ADDRL = (uint8_t)(addr & 0xFF);
|
||||
/* 触发 */
|
||||
TA = 0x5A;
|
||||
TA = 0xA5;
|
||||
IAP_TRIG = 0x5A;
|
||||
IAP_TRIG = 0xA5;
|
||||
/* NOP 等待 */
|
||||
__asm nop __endasm;
|
||||
__asm nop __endasm;
|
||||
dat = IAP_DATA;
|
||||
IAP_CONTR = 0x00; /* 关闭IAP */
|
||||
return dat;
|
||||
}
|
||||
|
||||
static void IAP_WriteByte(uint16_t addr, uint8_t dat) {
|
||||
IAP_CONTR = IAPEN; /* 使能IAP */
|
||||
IAP_CMD = IAP_WRITE;
|
||||
IAP_ADDRH = (uint8_t)(addr >> 8);
|
||||
IAP_ADDRL = (uint8_t)(addr & 0xFF);
|
||||
IAP_DATA = dat;
|
||||
/* 触发 */
|
||||
TA = 0x5A;
|
||||
TA = 0xA5;
|
||||
IAP_TRIG = 0x5A;
|
||||
IAP_TRIG = 0xA5;
|
||||
__asm nop __endasm;
|
||||
__asm nop __endasm;
|
||||
IAP_CONTR = 0x00; /* 关闭IAP */
|
||||
}
|
||||
|
||||
static void IAP_EraseSector(uint16_t addr) {
|
||||
IAP_CONTR = IAPEN; /* 使能IAP */
|
||||
IAP_CMD = IAP_ERASE;
|
||||
IAP_ADDRH = (uint8_t)(addr >> 8);
|
||||
IAP_ADDRL = (uint8_t)(addr & 0xFF);
|
||||
/* 触发 */
|
||||
TA = 0x5A;
|
||||
TA = 0xA5;
|
||||
IAP_TRIG = 0x5A;
|
||||
IAP_TRIG = 0xA5;
|
||||
__asm nop __endasm;
|
||||
__asm nop __endasm;
|
||||
IAP_CONTR = 0x00; /* 关闭IAP */
|
||||
}
|
||||
|
||||
/* ========================================================================
|
||||
* EEPROM 配置存储
|
||||
* ======================================================================== */
|
||||
|
||||
static uint8_t EEPROM_IsBound(void) {
|
||||
return (IAP_ReadByte(EEPROM_ADDR_BIND_FLAG) == EEPROM_BIND_MAGIC);
|
||||
}
|
||||
|
||||
static void EEPROM_LoadConfig(void) {
|
||||
if (!EEPROM_IsBound()) {
|
||||
/* 未对频, 进入对频模式 */
|
||||
rx_state = RX_STATE_BINDING;
|
||||
return;
|
||||
}
|
||||
|
||||
/* 读取保存的配置 */
|
||||
for (uint8_t i = 0; i < NRF_ADDR_WIDTH; i++) {
|
||||
tx_addr[i] = IAP_ReadByte(EEPROM_ADDR_TX_ADDR + i);
|
||||
}
|
||||
rf_channel = IAP_ReadByte(EEPROM_ADDR_RF_CH);
|
||||
for (uint8_t i = 0; i < RF_PHRASE_LEN; i++) {
|
||||
bind_phrase[i] = IAP_ReadByte(EEPROM_ADDR_BIND_PHRASE + i);
|
||||
}
|
||||
|
||||
rx_state = RX_STATE_DISCONNECTED;
|
||||
}
|
||||
|
||||
static void EEPROM_SaveConfig(void) {
|
||||
/* 擦除扇区 (512字节, 从0x0000开始) */
|
||||
IAP_EraseSector(0x0000);
|
||||
|
||||
/* 写入对频标志 */
|
||||
IAP_WriteByte(EEPROM_ADDR_BIND_FLAG, EEPROM_BIND_MAGIC);
|
||||
|
||||
/* 写入TX地址 */
|
||||
for (uint8_t i = 0; i < NRF_ADDR_WIDTH; i++) {
|
||||
IAP_WriteByte(EEPROM_ADDR_TX_ADDR + i, tx_addr[i]);
|
||||
}
|
||||
|
||||
/* 写入RF频道 */
|
||||
IAP_WriteByte(EEPROM_ADDR_RF_CH, rf_channel);
|
||||
|
||||
/* 写入对频短语 */
|
||||
for (uint8_t i = 0; i < RF_PHRASE_LEN; i++) {
|
||||
IAP_WriteByte(EEPROM_ADDR_BIND_PHRASE + i, bind_phrase[i]);
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
#include "uart.h"
|
||||
|
||||
/* ========================================================================
|
||||
* UART1 - 串口通信 (使用Timer2做波特率发生器)
|
||||
* ======================================================================== */
|
||||
|
||||
/* UART1 中断服务 */
|
||||
void UART1_Interrupt(void) __interrupt(4) {
|
||||
if (RI) {
|
||||
RI = 0;
|
||||
uint8_t dat = SBUF;
|
||||
|
||||
if (out_mode == OUT_MODE_CRFS) {
|
||||
/* CRFS 模式: 接收飞控发来的 CRSF 帧并缓存转发 */
|
||||
if (dat == 0xEE) {
|
||||
/* CRSF 帧起始 */
|
||||
crfs_forward_len = 0;
|
||||
crfs_forward_buf[crfs_forward_len++] = dat;
|
||||
} else if (crfs_forward_len > 0 && crfs_forward_len < sizeof(crfs_forward_buf)) {
|
||||
crfs_forward_buf[crfs_forward_len++] = dat;
|
||||
/* 如果收到完整帧 (根据长度字段), 标记为待转发 */
|
||||
if (crfs_forward_len >= 3) {
|
||||
uint8_t frame_len = crfs_forward_buf[1] + 2; /* type+payload+crc = length field */
|
||||
if (crfs_forward_len >= frame_len) {
|
||||
/* 完整帧已收到, 保持缓存, 主循环会处理转发 */
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* 命令接收: 回车/换行结束 */
|
||||
if (dat == '\r' || dat == '\n') {
|
||||
if (uart_rx_idx > 0) {
|
||||
uart_rx_buf[uart_rx_idx] = '\0';
|
||||
uart_cmd_ready = 1;
|
||||
}
|
||||
uart_rx_idx = 0;
|
||||
} else {
|
||||
if (uart_rx_idx < UART_BUF_SIZE - 1) {
|
||||
uart_rx_buf[uart_rx_idx++] = dat;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (TI) {
|
||||
TI = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void UART1_SendByte(uint8_t dat) {
|
||||
SBUF = dat;
|
||||
while (!TI);
|
||||
TI = 0;
|
||||
}
|
||||
|
||||
static void UART1_SendString(const char *s) {
|
||||
while (*s) {
|
||||
UART1_SendByte((uint8_t)(*s++));
|
||||
}
|
||||
}
|
||||
|
||||
static void UART1_SendStringLen(const char *s, uint8_t len) {
|
||||
for (uint8_t i = 0; i < len; i++) {
|
||||
UART1_SendByte((uint8_t)s[i]);
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
# ifndef CONFIG
|
||||
# define CONFIG
|
||||
# include "CONFIG.h"
|
||||
# endif
|
||||
|
||||
/*
|
||||
uart初始化,
|
||||
uart发送,
|
||||
uart接收,
|
||||
uart命令解析,
|
||||
uart命令响应,
|
||||
uart接收缓冲区,
|
||||
uart发送缓冲区,
|
||||
uart接收索引,
|
||||
uart命令就绪标志,
|
||||
uart中断服务程序,
|
||||
uart波特率设置
|
||||
*/
|
||||
void UART1_Init(void);
|
||||
|
||||
void UART1_Interrupt(void) __interrupt(4);
|
||||
|
||||
void UART1_Send(void);
|
||||
void UART1_Receive(void);
|
||||
void UART1_ParseCommand(void);
|
||||
void UART1_Response(void);
|
||||
void UART1_SetBaudRate(void);
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
:03000000020006F5
|
||||
:03005F0002000399
|
||||
:0300030002006296
|
||||
:0700620075B20075B1002228
|
||||
:06003500E478FFF6D8FD9F
|
||||
:200013007900E94400601B7A0090006D780175A000E493F2A308B8000205A0D9F4DAF27526
|
||||
:02003300A0FF2C
|
||||
:20003B007800E84400600A790175A000E4F309D8FC7800E84400600C7900900001E4F0A3C3
|
||||
:04005B00D8FCD9FAFA
|
||||
:0D000600758107120069E5826003020003A6
|
||||
:04006900758200227A
|
||||
:00000001FF
|
||||
@@ -0,0 +1,255 @@
|
||||
#include "uart.h"
|
||||
|
||||
#define UART_Buf_Size 16
|
||||
|
||||
static char cmd[UART_Buf_Size];
|
||||
/* ========================================================================
|
||||
* UART1 - 串口通信 (使用Timer2做波特率发生器)
|
||||
* ========================================================================
|
||||
|
||||
# 串口驱动,需要包含以下内容
|
||||
* UART模式,波特率115200
|
||||
* 数据解析,命令表:
|
||||
模式切换 MODE(UART | SBUS | CRFS)
|
||||
模块地址 ADDR(0000000000)
|
||||
对频短语 PHRASE(xxxxxx)
|
||||
切换频道 TUN(040)
|
||||
清除信息 DEL(DATA)
|
||||
回传频率 TELEM(N) - 设置回传频率 1~10Hz
|
||||
* SBUS模式,波特率100000
|
||||
* CRFS模式,波特率420000,功能占位,暂不实现
|
||||
*/
|
||||
|
||||
static void UART_ParseCommand(void) {
|
||||
// 解析运行模式
|
||||
if (cmd[0] == 'M') {
|
||||
if (cmd_buf[5] == 'S'){
|
||||
Config.RunMode = UART_SBUS;
|
||||
SBUS_Init();
|
||||
UART_SendString(2, "OK");
|
||||
return;
|
||||
} else if (cmd_buf[5] == 'U') {
|
||||
Config.RunMode = UART_CMD;
|
||||
CMD_Init();
|
||||
UART_SendString(2, "OK");
|
||||
return;
|
||||
} else if (cmd_buf[5] == 'C') {
|
||||
CRFS_Init();
|
||||
Config.RunMode = UART_CRSF;
|
||||
UART_SendString(2, "OK");
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* ADDR(HHHHHHHHHH) - 切换NRF24L01地址 */
|
||||
else if (cmd[0] == 'A') {
|
||||
for (uint8_t i=0; i<5; i++) {
|
||||
uint8 h=0,l=0;
|
||||
/* 解析两位十六进制 */
|
||||
if (cmd_buf[6+i*2] >= '0' && cmd_buf[6+i*2] <= '9')
|
||||
h=cmd_buf[6+i*2]-'0';
|
||||
else if (cmd_buf[6+i*2] >= 'A' && cmd_buf[6+i*2] <= 'F')
|
||||
h=cmd_buf[6+i*2]-'A';
|
||||
else {
|
||||
UART_SendString(8, "ERR_ADDR");
|
||||
return;
|
||||
}
|
||||
|
||||
if (cmd_buf[7+i*2] >= '0' && cmd_buf[7+i*2] <= '9')
|
||||
h=cmd_buf[7+i*2]-'0';
|
||||
else if (cmd_buf[7+i*2] >= 'A' && cmd_buf[7+i*2] <= 'F')
|
||||
h=cmd_buf[7+i*2]-'A';
|
||||
else {
|
||||
UART_SendString(8, "ERR_ADDR");
|
||||
return;
|
||||
}
|
||||
|
||||
Config.RxAddr[i] = h | l;
|
||||
}
|
||||
// 应用
|
||||
WriteConfig();
|
||||
NRF24_SetAddr();
|
||||
return;
|
||||
}
|
||||
/* TUN(N) - 切换RF频道 */
|
||||
else if (cmd[0] == 'T' && cmd[1] == 'U') {
|
||||
uint8_t ch = 0;
|
||||
char *p = cmd + 4; /* 跳过 "TUN(" */
|
||||
while (*p >= '0' && *p <= '9') {
|
||||
ch = ch * 10 + (*p - '0');
|
||||
p++;
|
||||
}
|
||||
if (ch <= 125) {
|
||||
Config.RxAddr = ch
|
||||
NRF24L01_SetChannel();
|
||||
UART_SendString("OK");
|
||||
} else {
|
||||
UART_SendString("ERR_RANGE");
|
||||
}
|
||||
return;
|
||||
}
|
||||
/* DEL(BIND) - 清除对频信息 */
|
||||
else if (cmd[0] == 'D') {
|
||||
/* 擦除EEPROM中的对频标志 */
|
||||
IAP_EraseALL();
|
||||
UART_SendString("OK");
|
||||
return;
|
||||
}
|
||||
/* PHRASE(xxxxxx) - 设置对频短语, 1~6位字母数字 */
|
||||
else if (cmd[0] == 'P') {
|
||||
uint8 i;
|
||||
char *p = cmd + 7; /* 跳过 "PHRASE(" */
|
||||
/* 计算短语长度 (直到 ')' 或结束) */
|
||||
uint8 len = 0;
|
||||
while (p[len] && p[len] != ')' && len < RF_PHRASE_LEN) {
|
||||
char c = p[len];
|
||||
/* 只允许字母和数字 */
|
||||
if (!((c >= '0' && c <= '9') ||
|
||||
(c >= 'A' && c <= 'Z') ||
|
||||
(c >= 'a' && c <= 'z'))) {
|
||||
Cmd_Respond("ERR");
|
||||
return;
|
||||
}
|
||||
len++;
|
||||
}
|
||||
if (len < 1 || len > RF_PHRASE_LEN) {
|
||||
Cmd_Respond("ERR_RANGE");
|
||||
return;
|
||||
}
|
||||
/* 复制新短语 */
|
||||
for (i = 0; i < len; i++)
|
||||
Config.BindPhr[i] = (uint8)p[i];
|
||||
/* 剩余部分用空格填充 */
|
||||
for (i = len; i < 6; i++)
|
||||
Config.BindPhr[i] = ' ';
|
||||
|
||||
IAP_WriteConfig();
|
||||
UART_SendString("OK");
|
||||
return;
|
||||
}
|
||||
/* TELEM(N) - 设置回传频率 1~9Hz */
|
||||
else if (cmd[0] == 'T' && cmd[1] == 'E') {
|
||||
uint8 hz = 0;
|
||||
char *p = cmd + 6; /* 跳过 "TELEM(" */
|
||||
if (*p > '0' && *p <= '9') {
|
||||
hz = *p - '0';
|
||||
} else {
|
||||
Cmd_Respond("ERR_RANGE");
|
||||
return;
|
||||
}
|
||||
Config.TelemRate = hz;
|
||||
return;
|
||||
}
|
||||
// 发送了识别不了的东西
|
||||
else {
|
||||
UART_SendString("UNK");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void UART_SendByte(uint8 dat) {
|
||||
SBUF = dat;
|
||||
while (!TI);
|
||||
TI = 0;
|
||||
}
|
||||
|
||||
static void UART_SendString(uint8 len, char *str) {
|
||||
for(uint8 i = 0, i++, i < len){
|
||||
UART_SendByte(str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void SBUS_Init(void) {
|
||||
P_SW2 |= 0x80; /* 使能访问扩展SFR(若需访问T2相关XFR) */
|
||||
/* 1. 选择定时器2作为串口1的波特率发生器 */
|
||||
AUXR &= ~0x01; /* 先清除S1ST2,再置1 */
|
||||
AUXR |= 0x01; /* S1ST2 = 1 */
|
||||
/* 2. 定时器2配置为1T模式,启动 */
|
||||
AUXR |= (1 << 2); /* T2x12 = 1,不分频 */
|
||||
AUXR |= (1 << 4); /* T2R = 1,启动定时器2 */
|
||||
|
||||
/* 切换到 SBUS 波特率 100kbps */
|
||||
/* 3. 计算重载值:100kbps @ 40MHz,1T模式
|
||||
* Baud = SYSCLK / (4 * (65536 - reload))
|
||||
* reload = 65536 - SYSCLK / (4 * Baud)
|
||||
* = 65536 - 40000000 / (4 * 100000)
|
||||
* = 65536 - 100 = 65436 = 0xFF9C
|
||||
*/
|
||||
T2H = 0xFF;
|
||||
T2L = 0x9C;
|
||||
|
||||
/* 4. 串口模式:模式3(9位可变波特率),使能接收,REN=1 */
|
||||
SCON = 0xD0; /* SM0=1, SM1=1, SM2=0, REN=1, TB8=0 */
|
||||
|
||||
/* 5. 设置PCON:SMOD=0(无波特率加倍),SMOD0=1(启用帧错误检测,可选) */
|
||||
PCON &= ~0x80; /* SMOD = 0 */
|
||||
PCON |= 0x40; /* SMOD0 = 1 */
|
||||
|
||||
/* 6. 使能串口中断(根据需要) */
|
||||
ES = 1; /* 允许串口中断 */
|
||||
}
|
||||
|
||||
static void UART_Init(void) {
|
||||
P_SW2 |= 0x80; /* 使能访问扩展SFR(若需访问T2相关XFR) */
|
||||
|
||||
/* 1. 选择定时器2作为串口1的波特率发生器 */
|
||||
AUXR &= ~0x01; /* 先清除S1ST2,再置1 */
|
||||
AUXR |= 0x01; /* S1ST2 = 1 */
|
||||
|
||||
/* 2. 定时器2配置为1T模式,启动 */
|
||||
AUXR |= (1 << 2); /* T2x12 = 1,不分频 */
|
||||
AUXR |= (1 << 4); /* T2R = 1,启动定时器2 */
|
||||
|
||||
/* 3. 计算重载值:115200bps @ 40MHz,1T模式
|
||||
* Baud = SYSCLK / (4 * (65536 - reload))
|
||||
* reload = 65536 - SYSCLK / (4 * Baud)
|
||||
* = 65536 - 40000000 / (4 * 115200)
|
||||
* = 65536 - 86.805... ≈ 65536 - 87 = 65449 = 0xFFA9
|
||||
*/
|
||||
T2H = 0xFF;
|
||||
T2L = 0xA9;
|
||||
|
||||
/* 4. 串口模式:模式3(9位可变波特率),使能接收,REN=1 */
|
||||
SCON = 0xD0; /* SM0=1, SM1=1, SM2=0, REN=1, TB8=0 */
|
||||
|
||||
/* 5. 设置PCON:SMOD=0(无波特率加倍),SMOD0=1(启用帧错误检测) */
|
||||
PCON &= ~0x80; /* SMOD = 0 */
|
||||
PCON |= 0x40; /* SMOD0 = 1 */
|
||||
|
||||
/* 6. 使能串口中断(根据需要) */
|
||||
ES = 1; /* 允许串口中断 */ /* 允许串口中断 */
|
||||
}
|
||||
|
||||
void SBUS_Update(RFDATA dat){
|
||||
uint8 *p = &dat;
|
||||
for(i=0, i++, i<25){
|
||||
UART_SendByte(*p++);
|
||||
}
|
||||
}
|
||||
|
||||
/* UART1 中断服务 */
|
||||
void UART_Receive(void) __interrupt(4) {
|
||||
if (RI) {
|
||||
RI = 0;
|
||||
uint8 dat = SBUF;
|
||||
uint8 uart_rx_idx = 0;
|
||||
if (config.runModel == UART_CRFS) {
|
||||
/* CRFS 模式: 接收飞控发来的 CRSF 帧并缓存转发 */
|
||||
// 占位,暂不实现
|
||||
} else {
|
||||
/* 命令接收: 回车/换行结束 */
|
||||
if (dat == '\r' || dat == '\n') {
|
||||
if (uart_rx_idx > 0) {
|
||||
cmd_buf[uart_rx_idx] = '\0';
|
||||
UART_ParseCommand();
|
||||
}
|
||||
} else {
|
||||
if (uart_rx_idx < UART_Buff_Size - 1) {
|
||||
cmd_buff[uart_rx_idx++] = dat;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (TI) {
|
||||
TI = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
# ifndef CONFIG
|
||||
# define CONFIG
|
||||
# include "config.h"
|
||||
# endif
|
||||
|
||||
/* UART 接收缓冲 (放在 xdata) */
|
||||
static uint8 __xdata uart_rx_buf[UART_BUF_SIZE];
|
||||
|
||||
void UART_Init(void);
|
||||
void SBUS_Init(void);
|
||||
void CRFS_Init(void);
|
||||
|
||||
void UART_Receive(void) __interrupt(4);
|
||||
|
||||
void UART_SendByte(uint8 dat);
|
||||
void UART_SendString(uint8 size, char *str);
|
||||
void UART_ParseCommand(void);
|
||||
|
||||
/* 转换数据为sbus信号输出
|
||||
* sbus为25字节固定信号,数据结构如下:
|
||||
* Byte 1 | 帧头(固定为0x0F)
|
||||
* Byte 2-23 | 数据通道(16个11位数据)
|
||||
* Byte 24 | 标志位(包含帧丢失、故障保护等)
|
||||
* Byte 25 | 帧尾(固定为0x00)
|
||||
*/
|
||||
void SBUS_Update(RFDATA dat);
|
||||
Reference in New Issue
Block a user