【沁恒RISC-V内核 CH582】 3 电灯例程及按键获取初试
[复制链接]
本帖最后由 kit7828 于 2022-3-13 18:02 编辑
CH582的Demo例程感觉还是比较简单的,虽然可查阅的资料不多(或许没有去官方网站找资源吧)
试了点灯例程,以及PWM亮度调整例程,均比较顺利
以下是代码
#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 - PWM8 LED1
GPIOB_ModeCfg( GPIO_Pin_7, GPIO_ModeOut_PP_5mA ); // PB7 - PWM9 LED2
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 > 64) duty = 0;
PWMX_ACTOUT( CH_PWM9, duty, Low_Level, ENABLE ); //亮度增加25%
}
}
电灯比较正常,PWM虽然不是很明显,但是还是可以看到有变化的,只是在读取按键的时候出现了问题
开发板上提供的资料是PB4
但是在实际检测的时候,发现很糟糕,一直判断不了是不是按键了。
以为是电路元件松动等问题,改成PB2杜邦线直接接插3.3V和GND来检测
插上3.3V的时候,还是能够获得GPIOB_ReadPortPin( GPIO_Pin_2 )的值为1,但是一旦松开杜邦线,数值就自己跳了
一会高电平,一会低电平
这个数据显示的过程,杜邦线是悬空的。
插上3.3V和GND的时候还是正常的。
另外,发现代码一开始就配置串口的话,会导致下载到芯片的时候(串口下载),很难成功,所以程序开始延迟了2秒,再设置串口。
按键的问题,经过多次折腾,终于找到了问题,就是GPIO的模式中不要设置浮空输入,一定要设置成上拉或者下拉。
下面的代码是折腾后确定的代码,基本实现了期初的想法。
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 - PWM8 LED1
GPIOB_ModeCfg( GPIO_Pin_7, GPIO_ModeOut_PP_5mA ); // PB7 - PWM9 LED2
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 & 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 > 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;
}
}
}
|