CSDN版本

📅 2026/7/23 5:55:21
CSDN版本
CH582F RISC-V飞控板开发教程一硬件架构解析GPIO控制LED与按键交互完整代码关键词CH582F、RISC-V、飞控板、GPIO、嵌入式开发、MounRiver Studio、穿越机文章目录飞控板硬件架构与核心器件选型开发环境搭建MounRiver Studio WCH-Link ISPGPIO工作原理与CH582F寄存器详解LED闪烁程序实现SDK API 寄存器两种方式按键输入与软件消抖综合实验双按键控制四灯模式切换完整代码一、飞控板硬件架构1.1 系统框图本教程所使用的飞控板以沁恒微电子CH582F为主控集成了姿态感知、无线通信、电机驱动等功能模块。系统架构如下主控CH582FRISC-V RV32IMAC60MHz448KB Flash32KB SRAM姿态传感器MPU-6050六轴I2C通信内置DMP气压计SPL06SPI/I2C精度±0.06hPa射频前端AT2401C2.4G PALNA电机驱动4×SI2302 N-MOSFETRds45mΩId2.8A电机4×720/820型空心杯有刷电机指示灯4×LED红/绿双色分布在四角通信接口BLE 5.3 2.4G私有协议 USB 2.01.2 核心芯片参数CH582F主要规格参数规格CPU内核RISC-V RV32IMAC最高主频60MHzFlash448KBSRAM32KBGPIO2组×16pin (GPIOA/GPIOB)UART4个 (UART0~UART3)SPI2个 (SPI0/SPI1)I2C1个PWM4通道ADC多通道12位定时器4个 (TIM0~TIM3)无线BLE 5.3 2.4GUSBUSB 2.0 Full-Speed封装QFN32MPU-6050技术参数参数规格加速度量程±2g/±4g/±8g/±16g陀螺仪量程±250°/s~±2000°/sADC分辨率16位I2C速率最高400kHz工作电压2.375V~3.46V1.3 GPIO引脚分配表引脚功能方向说明PB15LED1前左输出高电平点亮PA11LED2前右输出高电平点亮PA14LED3后左输出高电平点亮PB4LED4后右输出高电平点亮PB14电机1 PWM输出前左电机转速PA12电机2 PWM输出前右电机转速PA13电机3 PWM输出后左电机转速PB7电机4 PWM输出后右电机转速PB12I2C SDA双向传感器数据PB13I2C SCL输出传感器时钟PA42.4G RX EN输出AT2401接收使能PA52.4G TX EN输出AT2401发送使能PA15ADC输入电池电压检测PA8KEY1输入总开关按键PA9KEY2输入模式切换按键PA9UART1_TX输出串口输出PA8UART1_RX输入串口输入PB11USB_P双向USB接口PB10USB_N双向USB接口二、开发环境搭建2.1 MounRiver Studio安装访问 www.mounriver.com 下载对应操作系统版本运行安装程序路径避免中文和空格全选组件IDE RISC-V GCC OpenOCD Device Support首次启动设置Workspace目录2.2 新建工程File → New → MounRiver Project → Project name: LED_Blink → Device Family: CH58x → Device: CH582F → Template: Empty Project工程结构LED_Blink/ ├── src/main.c // 用户代码 ├── Startup/ // 启动代码 │ ├── startup_CH58x.S │ └── system_CH58x.c ├── StdPeriphDriver/ // 外设驱动库 └── Ld/CH58x.ld // 链接脚本2.3 编译按CtrlB编译控制台显示 “Build Finished” 且无红色错误即为成功。末尾的 “No rule to make target post-build” 提示可忽略。2.4 固件下载方式一WCH-Link推荐开发调试用连接信号SWDIO、SWCLK、GND点击Debug按钮自动编译下载进入调试模式。方式二ISP串口烧录适合量产接线TX→RX交叉RX→TXGND→GND。操作步骤按住BOOT键按RESET键后松开松开BOOT键进入ISP BootloaderWCHISPTool选择CH582F → UART → 加载固件 → 烧写三、GPIO工作原理3.1 GPIO输出模式推挽输出Push-PullP-MOS N-MOS组合驱动能力强可直接驱动LED。CH582F最大提供20mA驱动电流。开漏输出Open-Drain仅N-MOS高电平需外接上拉电阻。常用于I2C总线。3.2 GPIO输入模式浮空输入无内部上下拉电平由外部决定易受干扰。上拉输入内部弱上拉50kΩ~100kΩ至VCC默认高电平。按键接地场景使用。下拉输入内部弱下拉至GND默认低电平。按键接VCC场景使用。3.3 CH582F GPIO寄存器寄存器功能操作R32_GPIOx_DIR方向0输入1输出R32_GPIOx_SET输出置位写1高电平R32_GPIOx_CLR输出清零写1低电平R32_GPIOx_IN输入读取读1高读0低R32_GPIOx_PU上拉使能写1使能R32_GPIOx_PD下拉使能写1使能R32_GPIOx_FUN_MODE功能复用00GPIO3.4 SDK API函数速查// 配置引脚模式GPIOA_ModeCfg(GPIO_Pin_x,GPIO_ModeOut_PP_20mA);// 推挽输出20mAGPIOB_ModeCfg(GPIO_Pin_x,GPIO_ModeIN_PU);// 上拉输入// 输出操作GPIOA_SetBits(GPIO_Pin_x);// 输出高电平GPIOA_ResetBits(GPIO_Pin_x);// 输出低电平GPIOA_InvertBits(GPIO_Pin_x);// 翻转输出// 输入读取valGPIOA_ReadPortPin(GPIO_Pin_x);// 读取电平GPIO模式常量常量含义GPIO_ModeIN_Floating浮空输入GPIO_ModeIN_PU上拉输入GPIO_ModeIN_PD下拉输入GPIO_ModeOut_PP_20mA推挽输出20mAGPIO_ModeOut_PP_5mA推挽输出5mAGPIO_ModeOut_OD_20mA开漏输出20mA四、LED闪烁程序4.1 SDK API方式推荐#includeCH58x_common.hintmain(void){SetSysClock(CLK_SOURCE_PLL_60MHz);// 配置PA4为推挽输出GPIOA_ModeCfg(GPIO_Pin_4,GPIO_ModeOut_PP_20mA);GPIOA_ResetBits(GPIO_Pin_4);// 初始熄灭while(1){GPIOA_InvertBits(GPIO_Pin_4);// 翻转电平DelayMs(500);// 延时500ms}}4.2 寄存器直接操作方式#includeCH58x_common.h#defineLED1_PIN(14)// PA4intmain(void){SetSysClock(CLK_SOURCE_PLL_60MHz);R32_GPIOA_DIR|LED1_PIN;// PA4输出R32_GPIOA_CLRLED1_PIN;// 初始低电平while(1){R32_GPIOA_SETLED1_PIN;DelayMs(500);R32_GPIOA_CLRLED1_PIN;DelayMs(500);}}4.3 多LED同时控制// 同时配置4个LED引脚为输出GPIOA_ModeCfg(GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_12|GPIO_Pin_13,GPIO_ModeOut_PP_20mA);// 同时点亮GPIOA_SetBits(GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_12|GPIO_Pin_13);// 同时熄灭GPIOA_ResetBits(GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_12|GPIO_Pin_13);4.4 流水灯效果#includeCH58x_common.h#defineLED1GPIO_Pin_4#defineLED2GPIO_Pin_5#defineLED3GPIO_Pin_12#defineLED4GPIO_Pin_13#defineLED_ALL(LED1|LED2|LED3|LED4)constuint32_tled_pins[]{LED1,LED2,LED3,LED4};intmain(void){SetSysClock(CLK_SOURCE_PLL_60MHz);GPIOA_ModeCfg(LED_ALL,GPIO_ModeOut_PP_20mA);GPIOA_ResetBits(LED_ALL);while(1){for(inti0;i4;i){GPIOA_ResetBits(LED_ALL);GPIOA_SetBits(led_pins[i]);DelayMs(200);}}}五、按键输入与软件消抖5.1 按键电路按键一端接GPIOPA8/PA9另一端接GND。GPIO配置为上拉输入。未按下内部上拉保持高电平 → 读为1按下直接接地 → 读为05.2 按键消抖原理机械按键按下瞬间产生5~20ms触点弹跳。软件消抖流程检测到低电平延时20ms等待抖动消失再次读取确认等待按键释放5.3 消抖代码实现uint8_tKey_Scan(void){if(GPIOA_ReadPortPin(GPIO_Pin_9)0)// 检测到低电平{DelayMs(20);// 消抖延时if(GPIOA_ReadPortPin(GPIO_Pin_9)0)// 二次确认{while(GPIOA_ReadPortPin(GPIO_Pin_9)0);// 等待释放return1;}}return0;}注意实际飞控程序中应使用非阻塞的定时器扫描方式每10~20ms扫描一次避免while死等阻塞飞控主循环。六、综合实验双按键控制四灯模式切换6.1 功能需求上电全灭按KEY1PA8四灯全亮按KEY2PA9切换跑马灯模式再按KEY2停止跑马灯恢复四灯全亮任意状态按KEY1全灭6.2 LED.h 头文件#ifndef__LED_H__#define__LED_H__#includeCH58x_common.h#defineRLED_RGPIO_Pin_11// PA11#defineRLED_LGPIO_Pin_15// PB15#defineGLED_RGPIO_Pin_4// PB4#defineGLED_LGPIO_Pin_14// PA14#defineKEY1_PINGPIO_Pin_8// PA8#defineKEY2_PINGPIO_Pin_9// PA9externuint8_tRun_flag;externuint8_tLed_All_Sta;voidLED_Init(void);voidRGB_LED_Off(void);voidRGB_LED_ON(void);voidRed_LED_STA(uint8_tOnOff);voidGrn_LED_STA(uint8_tOnOff);voidKEY_Init(void);uint8_tKEY_Scan(void);voidKEY_Process(uint8_tkey_val);voidLED_Running(void);#endif6.3 完整main.c#includeCH58x_common.h#includeLED.h#defineKEY_DELAY_MS20// 按键消抖时间#defineFLOW_INTERVAL120// 跑马灯切换间隔(ms)uint8_tRun_flag0;uint8_tLed_All_Sta0;uint32_tsoft_tick0;uint8_tflow_step0;voidLED_Init(void){GPIOA_ModeCfg(GPIO_Pin_11,GPIO_ModeOut_PP_5mA);// PA11 RLED_RGPIOB_ModeCfg(GPIO_Pin_15,GPIO_ModeOut_PP_5mA);// PB15 RLED_LGPIOA_ModeCfg(GPIO_Pin_14,GPIO_ModeOut_PP_5mA);// PA14 GLED_LGPIOB_ModeCfg(GPIO_Pin_4,GPIO_ModeOut_PP_5mA);// PB4 GLED_RRGB_LED_Off();}voidRGB_LED_Off(void){GPIOB_SetBits(GPIO_Pin_4|GPIO_Pin_15);GPIOA_SetBits(GPIO_Pin_11|GPIO_Pin_14);}voidRGB_LED_ON(void){GPIOB_ResetBits(GPIO_Pin_4|GPIO_Pin_15);GPIOA_ResetBits(GPIO_Pin_11|GPIO_Pin_14);}voidRed_LED_STA(uint8_tOnOff){switch(OnOff){case0x00:GPIOB_ResetBits(GPIO_Pin_15);GPIOA_ResetBits(GPIO_Pin_11);break;case0x01:GPIOB_SetBits(GPIO_Pin_15);GPIOA_ResetBits(GPIO_Pin_11);break;case0x10:GPIOB_ResetBits(GPIO_Pin_15);GPIOA_SetBits(GPIO_Pin_11);break;case0x11:GPIOB_SetBits(GPIO_Pin_15);GPIOA_SetBits(GPIO_Pin_11);break;}}voidGrn_LED_STA(uint8_tOnOff){switch(OnOff){case0x00:GPIOB_ResetBits(GPIO_Pin_4);GPIOA_ResetBits(GPIO_Pin_14);break;case0x01:GPIOB_SetBits(GPIO_Pin_4);GPIOA_ResetBits(GPIO_Pin_14);break;case0x10:GPIOB_ResetBits(GPIO_Pin_4);GPIOA_SetBits(GPIO_Pin_14);break;case0x11:GPIOB_SetBits(GPIO_Pin_4);GPIOA_SetBits(GPIO_Pin_14);break;}}voidKEY_Init(void){GPIOA_ModeCfg(KEY1_PIN|KEY2_PIN,GPIO_ModeIN_PU);}uint8_tKEY_Scan(void){if(GPIOA_ReadPortPin(KEY1_PIN)0){DelayMs(KEY_DELAY_MS);while(GPIOA_ReadPortPin(KEY1_PIN)0);DelayMs(KEY_DELAY_MS);return1;}if(GPIOA_ReadPortPin(KEY2_PIN)0){DelayMs(KEY_DELAY_MS);while(GPIOA_ReadPortPin(KEY2_PIN)0);DelayMs(KEY_DELAY_MS);return2;}return0;}voidKEY_Process(uint8_tkey_val){switch(key_val){case1:Led_All_Sta!Led_All_Sta;Run_flag0;flow_step0;soft_tick0;if(Led_All_Sta)RGB_LED_ON();elseRGB_LED_Off();break;case2:if(Led_All_Sta1){Run_flag!Run_flag;flow_step0;soft_tick0;if(Run_flag0)RGB_LED_ON();}break;}}voidLED_Running(void){if(Run_flag!1||Led_All_Sta!1){soft_tick0;return;}soft_tick;if(soft_tickFLOW_INTERVAL){soft_tick0;switch(flow_step){case0:Red_LED_STA(0x01);break;case1:Red_LED_STA(0x10);break;case2:Grn_LED_STA(0x01);break;case3:Grn_LED_STA(0x10);break;}flow_step(flow_step1)%4;}}intmain(void){LED_Init();KEY_Init();while(1){uint8_tkeyKEY_Scan();KEY_Process(key);LED_Running();DelayMs(1);}}6.4 扩展练习增加更多灯光模式呼吸灯、随机闪烁等实现长按功能短按切换模式长按1秒进入紧急闪烁用第二个按键实现加速/减速功能切换模式时用LED闪烁次数播报新模式编号总结本教程基于真实穿越机飞控板从硬件架构到GPIO编程进行了完整讲解。核心知识点CH582F硬件架构RISC-V主控 MPU-6050 SPL06 AT2401C MOSFET驱动开发环境MounRiver Studio WCH-Link/WCHISPToolGPIO输出推挽/开漏模式SDK API与寄存器两种操作方式GPIO输入上拉输入按键软件消抖标准流程综合应用状态机非阻塞定时实现多模式切换后续教程将涵盖I2C读取MPU-6050、SPI读取SPL06、PID控制算法、BLE通信等内容敬请关注。原创不易觉得有用请点赞收藏后续更新不迷路。