【沁恒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有得一比,稍要加点学习。不过经过我的上手说明后,应该会简单一些,我给大家填了坑!欢迎大家一起学习,如果说得不对,一起交流交流。
|