140 lines
3.3 KiB
C
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 */
|
|
} |