[RISC-V MCU 应用开发] 基于Systick的LED灯闪烁

[复制链接]
43|0
黄昏收获 发表于 2026-8-31 13:13 | 显示全部楼层 |阅读模式
沁恒又在组织竞赛了,本次使用CH32V317做主控,主要由于它兼顾了性能与价格。先熟悉一下开发环境MRSII,顺手使用Systick来闪烁一下LED灯。

沁恒CH32V317开发板与其它家不同,CH32V317的LED灯引脚并未连接到CH32V317的固定引脚之上,所以,我们必须再使用杜邦线将LED灯引脚与GPIO连接。——我开始还以为是原理图不完整呢!

CH32V317的LED灯.jpg

我把LED灯与PA0,PA1相连,结合原理图并对PA0,PA1两个引脚设置为开涮模式。当GPIO输出0时,打开LED灯,输出1时,关闭LED灯。GPIO的初始化配置代码如下:


  1. void led_init (void) {
  2.     GPIO_InitTypeDef GPIO_InitStructure = {0};

  3.     RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ENABLE);
  4.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  5.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  6.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  7.     GPIO_Init (GPIOC, &GPIO_InitStructure);

  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  9.     GPIO_Init (GPIOC, &GPIO_InitStructure);
  10. }

平时在Cortex-M系列下开发项目,常常用到Systick中断。使用它来做时基,简单方便,也物尽其用。所以,在RISC-V的CH32V317中依旧使用Systick产生1ms的时基,并用来控制LED的闪烁频率。Systick的初始化配置代码如下:

  1. void systick_config(uint64_t ticks)
  2. {
  3.   SysTick->SR &= ~(1 << 0); // clear State flag
  4.   SysTick->CMP = ticks - 1;
  5.   SysTick->CNT = 0;
  6.   SysTick->CTLR = 0xF;

  7.   NVIC_SetPriority(SysTicK_IRQn, 15);
  8.   NVIC_EnableIRQ(SysTicK_IRQn);
  9. }

再通过简单的查询方式实现LED灯的闪烁功能,两个LED灯一个1Hz,一个0.5Hz闪烁。

  1. void led_output (uint8_t id, uint8_t onoff) {
  2.     switch (id) {
  3.     case 0: {
  4.         if (onoff == 0) {
  5.             GPIO_WriteBit (GPIOC, GPIO_Pin_0, Bit_SET);
  6.         } else {
  7.             GPIO_WriteBit (GPIOC, GPIO_Pin_0, Bit_RESET);
  8.         }
  9.         break;
  10.     }
  11.     case 1: {
  12.         if (onoff == 0) {
  13.             GPIO_WriteBit (GPIOC, GPIO_Pin_1, Bit_SET);
  14.         } else {
  15.             GPIO_WriteBit (GPIOC, GPIO_Pin_1, Bit_RESET);
  16.         }
  17.         break;
  18.     }
  19.     default:

  20.         break;
  21.     }
  22. }

  23. int main (void) {
  24.     timebase_tick = 0;
  25.     NVIC_PriorityGroupConfig (NVIC_PriorityGroup_2);
  26.     systick_config (SystemCoreClock / 1000);

  27.     log_init();

  28.     led_init();

  29.     while (1) {
  30.         if (timebase_tick == 0) {
  31.             timebase_tick = 1000;
  32.             logprintf ("log time: %d:%d\r\n", log_time.sec, log_time.msec);
  33.         }
  34.         if (led_tick[0] == 0) {
  35.             led_tick[0] = 500;
  36.             if (led_status[0] == 0) {
  37.                 led_status[0] = 1;
  38.                 led_output (0, 1);

  39.             } else {
  40.                 led_status[0] = 0;
  41.                 led_output (0, 0);
  42.             }
  43.         }
  44.         if (led_tick[1] == 0) {
  45.             led_tick[1] = 1000;
  46.             if (led_status[1] == 0) {
  47.                 led_status[1] = 1;
  48.                 led_output (1, 1);

  49.             } else {
  50.                 led_status[1] = 0;
  51.                 led_output (1, 0);
  52.             }
  53.         }
  54.     }
  55. }
led闪烁.gif


整个开发环境搭建还是相当轻松,直接在MRSII中新建工程即可,软件代码框架沁恒已为大家准备好,并且其分层也符合主流软件架构。如果之前有嵌入式开发经验,转入到RISC-V内核开发并不会增加多少学习成本。












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

本版积分规则

10

主题

39

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0