3324|2

6960

帖子

11

TA的资源

版主

楼主
 

【沁恒RISC-V内核 CH582】5 点亮LED灯 [复制链接]

 

前面用UART例子,做了串口收发,下面做到点灯:

看了好久的原理图,没有直接连接LED的IO,最后想到跳线:

 拿到跳线,把PB19连到了LED2上。

目前还没有找到延时程序,找到了定时器0的例子:

 这里我把GPIOB—15 更改成GPIOB19,时间把100ms改成500ms。

 UART+LED主程序如下:

/********************************** (C) COPYRIGHT *******************************
 * File Name          : Main.c
 * Author             : WCH
 * Version            : V1.0
 * Date               : 2020/08/06
 * Description 		    : 串口1收发演示
 *******************************************************************************/

#include "CH58x_common.h"

UINT8 TxBuff[] = "This is a tx exam\r\n";
UINT8 RxBuff[100];
UINT8 trigB;

int main()
{
  UINT8 len;

  SetSysClock( CLK_SOURCE_PLL_60MHz );

  /* 配置串口1:先配置IO口模式,再配置串口 */
  GPIOA_SetBits( GPIO_Pin_9 );
  GPIOA_ModeCfg( GPIO_Pin_8, GPIO_ModeIN_PU );			// RXD-配置上拉输入
  GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA );    // TXD-配置推挽输出,注意先让IO口输出高电平
  UART1_DefInit();

#if 1       // 测试串口发送字符串
  UART1_SendString( TxBuff, sizeof( TxBuff ) );

#endif   

#if 1       /* 定时器0,设定100ms定时器进行IO口闪灯, PB15-LED */

  GPIOB_SetBits( GPIO_Pin_19 );
  GPIOB_ModeCfg( GPIO_Pin_19, GPIO_ModeOut_PP_20mA );

  TMR0_TimerInit( FREQ_SYS / 2 );                  // 设置定时时间 100ms
  TMR0_ITCfg( ENABLE, TMR0_3_IT_CYC_END );          // 开启中断
  PFIC_EnableIRQ( TMR0_IRQn );
#endif

#if 1       // 查询方式:接收数据后发送出去
  while( 1 )
  {
    len = UART1_RecvString( RxBuff );
    if ( len )
    {
      UART1_SendString( RxBuff, len );
    }
  }

#endif    

#if 0      // 中断方式:接收数据后发送出去
  UART1_ByteTrigCfg( UART_7BYTE_TRIG );
  trigB = 7;
  UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT );
  PFIC_EnableIRQ( UART1_IRQn );
#endif    

  while( 1 )
    ;
}

__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler( void )
{
  UINT8V i;

  switch ( UART1_GetITFlag() )
  {
    case UART_II_LINE_STAT :        // 线路状态错误
    {
      UART1_GetLinSTA();
      break;
    }

    case UART_II_RECV_RDY :          // 数据达到设置触发点
      for ( i = 0; i != trigB; i++ )
      {
        RxBuff[i] = UART1_RecvByte();
        UART1_SendByte( RxBuff[i] );
      }
      break;

    case UART_II_RECV_TOUT :         // 接收超时,暂时一帧数据接收完成
      i = UART1_RecvString( RxBuff );
      UART1_SendString( RxBuff, i );
      break;

    case UART_II_THR_EMPTY :         // 发送缓存区空,可继续发送
      break;

    case UART_II_MODEM_CHG :         // 只支持串口0
      break;

    default :
      break;
  }

}

__INTERRUPT
__HIGH_CODE
void TMR0_IRQHandler( void )        // TMR0 定时中断
{
  if ( TMR0_GetITFlag( TMR0_3_IT_CYC_END ) )
  {
    TMR0_ClearITFlag( TMR0_3_IT_CYC_END );      // 清除中断标志
    GPIOB_InverseBits( GPIO_Pin_19 );
  }
}

这里要注意的是,我把延时程序复制过来,死活编译不过:

 说没有找到`TMR0_TimerInit'这里函数的定义,搞了好久才知道,CH58x_timer0.c没有参与编译

在CH58x+timer0.c上右键,选择参与编译才能通过。

 最后效果成功的点亮LED2,并做到半秒种闪烁:

上手的感觉就是CH582上手比较容易,性能强,相比刚入手STM8,STM32,CH582配置要精简,运行速度快。做为入门第一难的就是如果熟悉下载固件,跟ESP8266有得一比,稍要加点学习。不过经过我的上手说明后,应该会简单一些,我给大家填了坑!欢迎大家一起学习,如果说得不对,一起交流交流。
 

最新回复

厉害,我也是找了半天LED连在哪里,没想到是需要飞线的。另外,延时函数在"CH58x_sys.h"文件中 void mDelayuS( UINT16 t );        /* uS 延时 */ void mDelaymS( UINT16 t );        /* mS 延时 */   详情 回复 发表于 2022-2-27 15:36
点赞(1) 关注
 
 

回复
举报

1632

帖子

4

TA的资源

纯净的硅(高级)

沙发
 

不错,RISC-V应该是个后起之秀

个人签名科技改变生活
 
 
 

回复

274

帖子

8

TA的资源

纯净的硅(初级)

板凳
 

厉害,我也是找了半天LED连在哪里,没想到是需要飞线的。另外,延时函数在"CH58x_sys.h"文件中

void mDelayuS( UINT16 t );        /* uS 延时 */
void mDelaymS( UINT16 t );        /* mS 延时 */

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表