mmuyu 发表于 2023-8-15 21:58:57

将机智云固件移植到risc-v平台以CH32V203C8T6为例

    虽然rsic-v起步较晚,但是目前rsic-v的生态正在迅速发展,各大厂商为其提供工具和开发环境,国产的risc-v芯片也不断涌现。对比arm,risc-v的主要优势在于指令集授权费用低,相比arm可以节省大量成本。而且risc-v是开源的,更具创造性。

接下来,简介一下使用的芯片。使用的是南京沁恒开发的青稞risc-v CH32V203C8T6 这是一款是基于32位RISC-V内核设计的工业级增强型低功耗通用微控制器,最高支持144MHz系统主频,低功耗,运行功耗低至45uA/MHz。

从系统框图可以看出,跟stm32f103还是很类似的,外设也很丰富,可以支持我们开发各种设备。
接下来,我们来移植机智云的协议,机智云已经为我们提供了通用平台的代码,我们只需要完成串口,定时器的驱动,剩下的对于事件,数据的处理无需我们关注,这大大减少了我们需要编写的代码。

因为risc-v内核不同于arm keil开发已经不是很适用了,因此这里使用的是risc-v的集成开发环境MounRiver Studio。
首先,我们创建一个新的项目,这里还是很方便的,选择芯片型号,完成后自动帮我们建立需要的启动文件,库文件。

接下来,创建两个文件夹 Gizwits和Utils 用于存放机智云的数据点和组件

然后将我们从机智云设备下载的通用mcu代码对于文件夹内的文件复制到项目新建立的文件夹内,main文件除外。
接下来,右键项目名称 选择properties->c/c++ General->paths and symbols->includes._gun c 点击add包含我们的库文件

目录地址是工程文件夹下的文件,projname变量能方便我们迁移项目。填写后勾选属于工作空间路径。

接下来,参考通用平台的main文件,为项目自带的main文件添加头文件和函数。
首先是头文件。
#include <string.h>
#include "gizwits_product.h"
#include "common.h"接下来,实现串口接收中断,首先是串口的初始化函数和中断初始化,他们实现的库文件和stm标准库很类似,因此上手还是比较方便的。

初始化完成,编写对应的中断函数,这里会有一点小差别。需要**中断函数。
void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void USART2_IRQHandler(void)
{
    if(USART_GetITStatus(USART2, USART_IT_RXNE)!=RESET)
    {
      uint8_t recvData=USART_ReceiveData(USART2);
      UART_IRQ_FUN(recvData);
    }
}这里,我们在main文件里写中断函数,再调用机智云的函数进行处理。注意**函数。

完成串口接收后,我们要完成串口的发送,直接调用串口发送函数即可,机智云的代码已经写好伪代码和注释。
包含内核头文件
#include "ch32v20x_conf.h"在product文件内完成数据发送
接下来,实现定时器中断,机智云需要一个1ms的定时器中断处理事件。
从数据手册可以得知,定时器挂载在APB1 并且在apb1预分频不为1的情况下,时钟的频率是apb1的2倍。

一般没修改过apb1为2分频,在时钟频率为96mhz情况下,定时器频率也是96mhz
因此生成1ms的中断需要预分频96-1 重装载值1000-1
定时器初始化代码

完成定时器中断,并将中断提供给机智云协议依赖的函数。

void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void TIM2_IRQHandler(void){
    if( TIM_GetITStatus(TIM2, TIM_IT_Update) == SET ){
      TIMER_IRQ_FUN();
      TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}编写一个简单的开关灯示例测试是否正常。
if(0x01 == currentDataPoint.valueLED_OnOff_1)
            {
            //user handle
                GPIO_ResetBits(GPIOA, GPIO_Pin_0);
            }
            else
            {
            //user handle
                GPIO_SetBits(GPIOA, GPIO_Pin_0);
            }
            break;此时,项目已经能正常编译了,我们把项目烧录到开发板,并且将串口连接到esp8266模组测试,通过数据手册可以得知对应串口的复用引脚,我这里是pa2->txpa3->rx

效果:



页: [1]
查看完整版本: 将机智云固件移植到risc-v平台以CH32V203C8T6为例