沁恒CH582M开发板-2-系统时钟配置初探

本文深入探讨了CH582M开发板的系统时钟配置,通过分析官方例程中的时钟初始化函数,揭示了其如何将时钟设置为60MHz的过程,并详细解释了相关代码和参数含义。

CH582-2-系统时钟配置初探

在官网的例程中,一般main函数前面都有一句:

SetSysClock(CLK_SOURCE_PLL_60MHz);

那么这个函数到底做了什么呢?是真的把时钟设置为60MHz了吗,我们打开源码看一下:

首先看看参数:


/**
 * @brief  系统主频定义
 */
typedef enum
{
    CLK_SOURCE_LSI = 0x00,
    CLK_SOURCE_LSE,

    CLK_SOURCE_HSE_16MHz = 0x22,
    CLK_SOURCE_HSE_8MHz = 0x24,
	......此处省略

    CLK_SOURCE_PLL_80MHz = 0x46,
    CLK_SOURCE_PLL_60MHz = 0x48,
    ......此处省略
} SYS_CLKTypeDef;

然后是主函数,具体细节已经注释:


/*********************************************************************
 * @fn      SetSysClock
 *
 * @brief   配置系统运行时钟
 *
 * @param   sc      - 系统时钟源选择 refer to SYS_CLKTypeDef
 *
 * @return  none
 */
__HIGH_CODE  /*__HIGH_CODE意为将代码下载到ram里运行 */
void SetSysClock(SYS_CLKTypeDef sc)
{
    uint32_t i;
    /*
     * 对 R8_SAFE_ACCESS_SIG 寄存器的操作就是开关安全模式,下面是手册里的解释:
     * 部分寄存器(访问属性为RWA)为保护寄存器,必须进入安全访问模式才能进行写操作。
     * 对该寄存器先写入0x57,再写入0xA8,即可进入安全访问模式.
     * 并且限时约16个主
<think>我们参考引用[3]和引用[4]的内容,因为这两个引用直接与沁恒CH582M开发板的LED控制和按键扫描相关。引用[3]提到了按键扫描(按键控制LED亮灭),引用[4]则提供了点亮LED的代码示例。目标:在沁恒CH582M开发板上实现按键扫描,并通过按键控制LED的亮灭。步骤:1.硬件连接:根据引用[3]的接线图,我们需要知道按键和LED分别连接在哪个GPIO引脚上。但引用中并未给出具体引脚,因此我们需要根据常见的开发板设计进行假设。通常,开发板会有一个用户按键和一个用户LED。根据引用[4]的代码,LED连接在GPIOB的Pin4(PB4)上。那么按键呢?引用[3]没有给出,但我们可以参考常见的配置,比如按键接在某个GPIO上(比如PA0)并接地,采用上拉输入,当按键按下时引脚为低电平。2.初始化:需要初始化LED对应的GPIO为输出,初始化按键对应的GPIO为输入(上拉)。3.按键扫描:循环检测按键引脚的电平状态。注意消抖(软件延时或硬件消抖)。4.控制LED:当检测到按键按下时,改变LED的状态(亮灭切换)。假设:LED:PB4(输出)按键:假设为PB5(由于引用中未明确,这里假设一个常见的引脚,实际使用需根据开发板原理图调整)注意:沁恒CH582M的GPIO配置函数使用方式。参考引用[4]的代码,我们使用`GPIOB_ModeCfg`来配置GPIO模式。输出模式为`GPIO_ModeOut_PP_5mA`(推挽输出,5mA驱动能力)。输入模式我们使用上拉输入:`GPIO_ModeIN_PU`(上拉输入)。按键消抖:简单的方法是在检测到按键按下后延时一段时间再检测,如果还是按下状态,则确认按下。代码结构:-设置系统时钟-初始化LED引脚(PB4)为输出-初始化按键引脚(假设为PB5)为上拉输入-主循环中扫描按键状态如果检测到低电平(按键按下),则延时消抖,再次确认,如果还是低电平,则执行LED状态翻转(使用GPIOB_InverseBits函数翻转PB4)注意:按键释放检测,避免连续触发。我们可以采用检测按键释放后再执行操作,或者使用标志位来避免重复触发。这里我们采用简单的处理:当检测到按键按下并消抖确认后,翻转LED,然后等待按键释放(避免按住不放时连续翻转)。代码示例:```c#include"CH58x_common.h"#defineLED_PINGPIO_Pin_4//PB4#defineKEY_PINGPIO_Pin_5//假设按键在PB5intmain(){SetSysClock(CLK_SOURCE_PLL_60MHz);//设置系统时钟为60MHz//配置LED引脚(PB4)为推挽输出,5mA驱动能力GPIOB_ModeCfg(LED_PIN,GPIO_ModeOut_PP_5mA);//配置按键引脚(PB5)为上拉输入GPIOB_ModeCfg(KEY_PIN,GPIO_ModeIN_PU);while(1){//检测按键是否按下(低电平)if(GPIOB_ReadPortPin(KEY_PIN)==0){//延时消抖,大约10msDelayMs(10);//再次检测if(GPIOB_ReadPortPin(KEY_PIN)==0){//翻转LEDGPIOB_InverseBits(LED_PIN);//等待按键释放(变为高电平)while(GPIOB_ReadPortPin(KEY_PIN)==0);//释放消抖(可选)DelayMs(10);}}}}```注意:上述代码中,按键释放后也有一个延时消抖,防止抖动造成的误判。实际应用中,可以根据需要调整延时时间。如果开发板上的按键连接的不是PB5,请根据实际电路修改`KEY_PIN`的定义。例如,如果按键连接在PA0,则需要使用`GPIOA_ModeCfg`来配置,并读取`GPIOA_ReadPortPin`。另外,沁恒的库函数中,读取单个引脚的状态使用`GPIOx_ReadPortPin`,其中x为端口号(A、B等)。翻转引脚使用`GPIOx_InverseBits`。请根据实际开发板的原理图调整引脚。如果没有原理图,可以尝试查找开发板的文档或者参考其他例程。常见的CH582开发板(如WCH官方开发板)的按键和LED连接引脚可能不同,需要确认。根据引用[3]的标题,它也是按键控制LED亮灭,所以我们可以认为该代码是可行的。最后,烧录程序到开发板,测试按键控制LED亮灭。如果遇到问题,请检查硬件连接和引脚配置。§§相关问题§§1.沁恒CH582M开发板的按键和LED分别连接在哪些GPIO引脚上?2.如何优化按键扫描代码以减少CPU占用?3.沁恒CH582M的GPIO输入输出模式有哪些?如何选择?4.如何实现按键的长按和短按功能?</think>### 沁恒CH582M开发板按键控制LED实现 #### 实现步骤 1. **硬件连接确认** - LED:通常接在`PB4`引脚(参考引用[4]) - 按键:开发板常用`PB22`或`PB23`(参考引用[3]原理图) - 需检查开发板原理图确认具体引脚 2. **GPIO初始化** ```c #include "CH58x_common.h" void GPIO_Init(void) { // 设置系统时钟(60MHz) SetSysClock(CLK_SOURCE_PLL_60MHz); // LED引脚配置(PB4推挽输出) GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA); // 按键引脚配置(PB22上拉输入) GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeIN_PU); } ``` 3. **按键扫描与LED控制逻辑** ```c int main() { GPIO_Init(); while(1) { // 检测按键按下(低电平有效) if(GPIOB_ReadPortPin(GPIO_Pin_22) == 0) { DelayMs(20); // 消抖延时 // 确认按键持续按下 if(GPIOB_ReadPortPin(GPIO_Pin_22) == 0) { // LED状态翻转 GPIOB_InverseBits(GPIO_Pin_4); // 等待按键释放 while(GPIOB_ReadPortPin(GPIO_Pin_22) == 0); } } } } ``` #### 关键说明 1. **按键消抖** 通过`DelayMs(20)`消除机械按键抖动(引用[3]实践) 2. **电平逻辑** - 按键按下:引脚被拉低(`0`) - LED亮灭控制:`GPIOB_InverseBits()`实现状态翻转 3. **烧录方法** 使用WCH-ISP工具通过USB下载程序(引用[3][4]) > **实际测试建议**: > 若LED不响应,请检查: > 1. 开发板硬件版本(引用[2]提及版本差异) > 2. 引脚是否与原理图一致 > 3. 是否启用上拉电阻(`GPIO_ModeIN_PU`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值