kit7828 发表于 2022-3-13 17:35

【沁恒RISC-V内核 CH582】 3 电灯例程及按键获取初试

本帖最后由 kit7828 于 2022-3-13 18:02 编辑

<p>CH582的Demo例程感觉还是比较简单的,虽然可查阅的资料不多(或许没有去官方网站找资源吧)</p>

<p>试了点灯例程,以及PWM亮度调整例程,均比较顺利</p>

<p>以下是代码</p>

<pre>
<code>#include "CH58x_common.h"

void DebugInit( void )
{
GPIOA_SetBits( GPIO_Pin_9 );
GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA );
UART1_DefInit();
}

int main()
{
unsigned char key = 0;
unsigned char duty = 0;

SetSysClock( CLK_SOURCE_PLL_60MHz );

/* 配置GPIO */
DelayMs( 2000 );

GPIOB_ModeCfg( GPIO_Pin_2, GPIO_ModeIN_Floating );    // PB2 - KEY

//GPIOB_ModeCfg( GPIO_Pin_6, GPIO_ModeOut_PP_5mA );    // PB6 - PWM8LED1
GPIOB_ModeCfg( GPIO_Pin_7, GPIO_ModeOut_PP_5mA );    // PB7 - PWM9LED2

PWMX_CLKCfg( 4 );                   // cycle = 4/Fsys
   PWMX_CycleCfg( PWMX_Cycle_64 );   // 周期 = 64*cycle
/* 配置串口调试 */
DebugInit();
PRINT( "Start @ChipID=%02x\n", R8_CHIP_ID );
   //PWMX_ACTOUT( CH_PWM8, 64 / 4, Low_Level, ENABLE );   // 25% 占空比               [ ( 64 / 4)    /    周期64   =25% ]
PWMX_ACTOUT( CH_PWM9, 64 / 4, Low_Level, ENABLE );   // 25% 占空比

while( 1 ){
      /* GPIOB端口引脚状态,0-引脚低电平,(!0)-引脚高电平 */

      PRINT( "GPIOB_ReadPortPin( GPIO_Pin_2 ) = %d \r\n", GPIOB_ReadPortPin( GPIO_Pin_2 ));
      DelayMs( 1000 );
      GPIOB_InverseBits(GPIO_Pin_6);    //LED1 翻转
      duty += 16;
      if(duty &gt; 64) duty = 0;
      PWMX_ACTOUT( CH_PWM9, duty, Low_Level, ENABLE );//亮度增加25%

}
}</code></pre>

<p>电灯比较正常,PWM虽然不是很明显,但是还是可以看到有变化的,只是在读取按键的时候出现了问题</p>

<p>开发板上提供的资料是PB4</p>

<p>&nbsp;但是在实际检测的时候,发现很糟糕,一直判断不了是不是按键了。</p>

<p>以为是电路元件松动等问题,改成PB2杜邦线直接接插3.3V和GND来检测</p>

<p>插上3.3V的时候,还是能够获得GPIOB_ReadPortPin( GPIO_Pin_2 )的值为1,但是一旦松开杜邦线,数值就自己跳了</p>

<p>一会高电平,一会低电平</p>

<p>&nbsp;这个数据显示的过程,杜邦线是悬空的。</p>

<p>插上3.3V和GND的时候还是正常的。</p>

<p>另外,发现代码一开始就配置串口的话,会导致下载到芯片的时候(串口下载),很难成功,所以程序开始延迟了2秒,再设置串口。</p>

<p>按键的问题,经过多次折腾,终于找到了问题,就是GPIO的模式中不要设置浮空输入,一定要设置成上拉或者下拉。</p>

<p>下面的代码是折腾后确定的代码,基本实现了期初的想法。</p>

<pre>
<code>int main()
{
unsigned key = 0;
unsigned char duty = 0;

SetSysClock( CLK_SOURCE_PLL_60MHz );

/* 配置GPIO */
DelayMs( 2000 );//此处延时为了串口能够顺利下载
//此处一定要设置上拉,不能浮空,否则检测会错乱
GPIOB_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_PU );    // PB4 - KEY

GPIOB_ModeCfg( GPIO_Pin_6, GPIO_ModeOut_PP_5mA );    // PB6 - PWM8LED1
GPIOB_ModeCfg( GPIO_Pin_7, GPIO_ModeOut_PP_5mA );    // PB7 - PWM9LED2

PWMX_CLKCfg( 4 );                   // cycle = 4/Fsys
   PWMX_CycleCfg( PWMX_Cycle_64 );   // 周期 = 64*cycle
/* 配置串口调试 */
DebugInit();
PRINT( "Start @ChipID=%02x\n", R8_CHIP_ID );
   //PWMX_ACTOUT( CH_PWM8, 64 / 4, Low_Level, ENABLE );   // 25% 占空比               [ ( 64 / 4)    /    周期64   =25% ]
PWMX_ACTOUT( CH_PWM9, 16 / 4, Low_Level, ENABLE );   // 1/16% 占空比

while( 1 ){
      /* GPIOB端口引脚状态,0-引脚低电平,(!0)-引脚高电平 */

      if(GPIOB_ReadPortPin( GPIO_Pin_4 )) {//高电平,按键释放
          if(key &amp; 0x40) key = 0x80;
          else key = 0;
      }
      else {    //低电平,按键按下
//          PRINT( "Key Pressed。\r\n");
          if(key) key |= 0x40;
          else key = 1;
      }

      DelayMs( 10 );

      if(key == 0x80) {
          PRINT( "Key Released。\r\n");
          duty += 4;
          if(duty &gt; 64) duty = 0;
          PRINT( "Duty=%02d\n", duty );
          PWMX_ACTOUT( CH_PWM9, duty, Low_Level, ENABLE );//亮度增加25%
          GPIOB_InverseBits(GPIO_Pin_6);    //LED1 翻转
          key = 0;
      }
}
}
</code></pre>

<p>&nbsp;</p>

nmg 发表于 2022-3-14 09:22

<p>&ldquo;发现代码一开始就配置串口的话,会导致下载到芯片的时候(串口下载),很难成功,所以程序开始延迟了2秒,再设置串口。&rdquo;</p>

<p>&nbsp;</p>

<p>&ldquo;按键的问题,经过多次折腾,终于找到了问题,就是GPIO的模式中不要设置浮空输入,一定要设置成上拉或者下拉。&rdquo;</p>

<p>&nbsp;</p>

<p><img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/pleased.gif" width="48" />划重点</p>

<p>这2个是没读手册导致的使用问题还是芯片设计方面的与众不同?</p>

kit7828 发表于 2022-3-16 13:30

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan34.gif" width="48" />,说实话,多半应该是没读手册的问题吧。估计这个是大家的通病吧<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/smile.gif" width="48" /></p>
页: [1]
查看完整版本: 【沁恒RISC-V内核 CH582】 3 电灯例程及按键获取初试