经过几天的煎熬,已经确认WS8204是RS21E芯片方案。
对应海思H2812系列大概可能是P352813N 1100E,也就是说有1M flash,而非512k。

海思H2812方案SDK目前处于半开源状态,同为H2812方案的小熊派BearPi-Pico H2821,安信可Ai-BS21-32S芯片是RS21(P352813 N1100)方案,与WS8204不同。也就是说如果直接拿这两个开发板的SDK开发的固件是不能运行在WS8204的。
由于授权的原因,官方没有提供SDK。这可以理解,因为目前海思只向合作厂商提供H2812的SDK,并且签署了协议,厂商也不便向外提供SDK。
那么只能自己东拼西凑弄了一个RS21E的SDK,来点一下灯。
由于个人也没有海思授权,更不想介入麻烦,只是基于研究的心态做一些尝试,所以请不要向我要SDK。
关于如何搭建环境请查询小熊派BearPi-Pico H2821,安信可Ai-BS21-32S官网有详细的安装步骤,但是SDK不适用。
推荐用小熊派的
BearPi-Pico H2821参见:https://bearpi.cn/core_board/bearpi/pico/h2821/software/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BAwindows.html
Ai-BS21-32S参见:https://gitee.com/Ai-Thinker-Open/Ai-BS21_SDK
简单地说就是:VS Code+deveco-device-tool+DevTools_CFBB
| VS Code | 用于编写代码。 | 点击跳转 |
| deveco-device-tool | 开发板编译工具 | 点击跳转 |
| DevTools_CFBB | H2821编译工具链 | 点击跳转 |
工具最好安装到C:\

vscode中会多出这个扩展,就可以进行工程配置,编译、下载了。

下面这个点灯的程序不是标准的写法,只是为了快速点灯验证。比较标准的程序是后面的demo。
1、app_os_init入口程序
void app_os_init(void)
{
uapi_pin_set_mode(6, HAL_PIO_FUNC_GPIO);
uapi_gpio_set_dir(6, GPIO_DIRECTION_OUTPUT);
uapi_gpio_set_val(6, GPIO_LEVEL_HIGH);
uapi_pin_set_mode(5, HAL_PIO_FUNC_GPIO);
uapi_gpio_set_dir(5, GPIO_DIRECTION_OUTPUT);
uapi_gpio_set_val(5, GPIO_LEVEL_LOW);
uint32_t ret;
uint32_t taskId;
TSK_INIT_PARAM_S taskParam = {
.usTaskPrio = 10, // 优先级
.uwStackSize = 0x1000, // 栈大小
.pcName = "demoTask", // 任务名
.pfnTaskEntry = (TSK_ENTRY_FUNC)taskEntryFunc, // 入口函数
};
ret = LOS_TaskCreate(&taskId, &taskParam);
if (ret != LOS_OK) {
// 错误处理
}
}初始化P05、P06,建立liteOS task。(板上P05、P06标反了)。
2、taskEntryFunc
void taskEntryFunc(void) {
while (1) {
// 任务执行逻辑
osal_msleep(1000);
uapi_gpio_toggle(6);
uapi_gpio_toggle(5);
}
}3、运行效果

4、DEMO

#include "common_def.h"
#include "osal_debug.h"
#include "cmsis_os2.h"
#include "app_init.h"
#define TASKS_TEST_TASK_STACK_SIZE 0x1000
#define TASKS_TEST_TASK_PRIO (osPriority_t)(17)
#define TASKS_TEST_DURATION_MS 1000
static void *tasks_test_task(const char *arg)
{
unused(arg);
while (1) {
osal_printk("Hello World WS8204\r\n");
osDelay(TASKS_TEST_DURATION_MS);
}
return NULL;
}
static void tasks_test_entry(void)
{
osThreadAttr_t attr;
attr.name = "TasksTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = TASKS_TEST_TASK_STACK_SIZE;
attr.priority = TASKS_TEST_TASK_PRIO;
if (osThreadNew((osThreadFunc_t)tasks_test_task, NULL, &attr) == NULL) {
/* Create task fail. */
}
}
/* Run the tasks_test_entry. */
app_run(tasks_test_entry);void app_os_init(void)
{
app_tasks_init();
}
我要赚赏金
