Files
ZhaTianRC/rx/main.c
T
2026-06-27 19:36:53 +08:00

140 lines
3.3 KiB
C

/**
* ZhaTianRX - STC8H1K08 接收机固件
* 主程序: NRF24L01 接收 + 4路舵机PWM + SBUS输出 + 串口命令
*
* MCU: STC8H1K08 (SOP16/SOP20)
* 编译: SDCC -mmcs51 --model-small
*
* 引脚分配:
* CH1(P3.7) CH2(P3.6) CH3(P3.5) CH4(P3.4) - 舵机PWM输出 50Hz
* BAT_ADC(P3.3/ADC11) - 电池电压分压输入
* LED(P3.2) - 状态指示灯 (低电平亮)
* TX(P3.1) - UART1 TX / SBUS 输出 (经板上三极管反相)
* RX(P3.0) - UART1 RX / 命令输入
*
* NRF24L01 (硬件SPI):
* SCK(P1.5) CE(P1.6) IRQ(P1.7) CSN(P5.4) MISO(P1.3) MOSI(P1.4)
*/
# ifndef CONFIG
# define CONFIG
# include "config.h"
# endif
#include "nrf24.h"
#include "uart.h"
void EEPROM_LoadConfig();
void Init();
void main(void) {
/* 系统初始化 */
System_Init();
GPIO_Init();
Timer0_Init();
UART1_Init();
ADC_Init();
IAP_Init();
/* 初始化NRF24L01 */
NRF24L01_Init();
/* 初始PWM: 中位 */
PWM_SetAllFailsafe();
// 从EEPROM加载配置 */
EEPROM_LoadConfig();
/* 检测NRF模块 */
if (!NRF24L01_Check()) {
/* NRF模块未检测到, 设置硬件错误标志, LED双闪 */
nrf_hw_error = 1;
}
while (1) {
/* 处理串口命令 */
UART1_ProcessCmd();
if (NRF_IRQ == 1) {
// 处理NRF24L01接收数据
NRF24L01_ProcessRX();
// 更新输出数据
outputFun();
}
/* LED状态指示 */
LED_Update();
}
}
void Init() {
// System_Init()
/* 切换到内部24MHz IRC */
P_SW2 |= EAXFR; /* 使能访问扩展SFR */
CLKDIV = 0x00; /* 主时钟不分频 */
CKSEL = 0x00; /* 选择内部高速IRC */
P_SW2 &= ~EAXFR;
/* 设置内部IRC为24MHz */
IRC24MCR = 0x80; /* 使能内部24MHz IRC */
while (!(IRC24MCR & 0x01)); /* 等待IRC稳定 */
// GPIO_Init()
/* P3.4-P3.7: 推挽输出 (PWM通道) */
P3M0 |= 0xF0;
P3M1 &= ~0xF0;
/* P3.2: 推挽输出 (LED) */
P3M0 |= 0x04;
P3M1 &= ~0x04;
/* P3.1: 推挽输出 (UART TX) */
P3M0 |= 0x02;
P3M1 &= ~0x02;
/* P3.0: 高阻输入 (UART RX) */
P3M0 &= ~0x01;
P3M1 |= 0x01;
/* P3.3: 高阻输入 (ADC) */
P3M0 &= ~0x08;
P3M1 |= 0x08;
/* NRF24L01 SPI 引脚 */
/* P1.5(SCK), P1.4(MOSI), P1.6(CE): 推挽输出 */
P1M0 |= 0x70;
P1M1 &= ~0x70;
/* P1.3(MISO): 高阻输入 */
P1M0 &= ~0x08;
P1M1 |= 0x08;
/* P1.7(IRQ): 高阻输入 (轮询) */
P1M0 &= ~0x80;
P1M1 |= 0x80;
/* P5.4(CSN): 推挽输出 */
P5M0 |= 0x10;
P5M1 &= ~0x10;
/* 初始电平 */
P34 = 0; P35 = 0; P36 = 0; P37 = 0; /* PWM 初始低 */
P32 = 1; /* LED 初始灭 (低电平亮) */
P31 = 1; /* TX 空闲高 */
/* NRF 引脚初始 */
NRF_CE = 0;
NRF_CSN = 1;
NRF_SCK = 0;
NRF_MOSI = 0;
// Timer_Init()
/* 16位自动重载模式, 1T */
TMOD &= ~0x0F;
TMOD |= 0x01; /* T0: 16位定时器 */
AUXR |= T0x12; /* T0: 1T模式 */
/* 4us @ 24MHz: 96 ticks */
TH0 = 0xFF;
TL0 = 0xA0; /* 65536 - 96 = 0xFFA0 */
ET0 = 1; /* 使能T0中断 */
TR0 = 1; /* 启动T0 */
}