[活动专区] 【AT-START-WB415测评】+基于Eclips+gcc实现BLE+OLED+研小操作系统

[复制链接]
 楼主| suncl110 发表于 2022-8-21 18:21 | 显示全部楼层 |阅读模式
ps, ip, ar, BLE, GCC, OLED
本帖最后由 suncl110 于 2022-8-22 08:14 编辑

收到AT-START-WB415板子也有点久了,是想好好对蓝牙部分试用一下。但鉴于网上各大神上传的BLE例程已经做的很好了,我在这里就不班门弄斧了。现在越来越多的公司对知识产权保护做的来越来越好了,在有些场所,比如我们自己基于学习的目的来做一些小程序的话,买个正版的集成编译器的话,预算就略显捉襟见肘(壕们可以不考虑^_^)在这里我向大家介绍一个免费的编译器环境--基于Eclipse+gcc方案。
1.     下载eclipse及GCC FOR ARM(这里略过,方法问度娘)
2.     将我上传的demo(AtBleDemo)导入到Eclipse工程(这里也略过,方法问度娘)
3.     下边我来介绍一下demo的具体细节及使用方法。
4. MAIN函数介绍:
int main(void)
{
    system_clock_config();
    at32_board_init();
    button_exint_init();
    uart_print_init(115200);
    uart_ble_init(115200);
    nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
   nvic_irq_enable(EXINT0_IRQn, 0, 0);
    //nvic_irq_enable(USART2_IRQn, 0, 0);
    nvic_irq_enable(USART3_IRQn, 0, 1);
    Oled_Init();
    Oled_Printf(0, 0, "    www.21ic.com");
    Oled_Printf(0, 2, "ARTERY-WB415@BLE");
//---------------------------------------------------------------------------------
    QueueInit(&BleRevQueue);//初始化蓝牙接收的数据的队列,先进先出
    at_cmd_send("AT+TPMODE0\r\n");
    //at_cmd_send("AT+TPMODE1\r\n");
//---------------------------------------------------------------------------------
    Task_CreateStatic(Task_LedRed,//新建一个红灯执行的任务(与开发板一致)
                      TaskLedRStack,
                      TASK_LEDR_STACK_DEPTH,
                      TASK_LEDR_PRO);
    Task_CreateStatic(Task_LedYellow,
                      TaskLedBStack,
                      TASK_LEDY_STACK_DEPTH,
                      TASK_LEDY_PRO);
    Task_CreateStatic(Task_LedGreen,
                      TaskLedGStack,
                      TASK_LEDG_STACK_DEPTH,
                      TASK_LEDG_PRO);
//---------------------------------------------------------------------------------
    Task_StartScheduler();//启动操作系统,接下来的程序会在各任务中运行,任务优先级及任务栈空间见附件的软件源程序
    while (1)
    {

    }
5.OLED部分介绍:
void Oled_Init(void)//初始化OLED
{
    I2C_Init();
    I2C_Delay(100);
    OLED_WR_Byte(0xAE, OLED_CMD); //关闭显示

    OLED_WR_Byte(0x40, OLED_CMD); //---set low column address
    OLED_WR_Byte(0xB0, OLED_CMD); //---set high column address

    OLED_WR_Byte(0xC8, OLED_CMD); //-not offset

    OLED_WR_Byte(0x81, OLED_CMD); //设置对比度
    OLED_WR_Byte(0xff, OLED_CMD);

    OLED_WR_Byte(0xa1, OLED_CMD); //段重定向设置

    OLED_WR_Byte(0xa6, OLED_CMD); //

    OLED_WR_Byte(0xa8, OLED_CMD); //设置驱动路数
    OLED_WR_Byte(0x1f, OLED_CMD);

    OLED_WR_Byte(0xd3, OLED_CMD);
    OLED_WR_Byte(0x00, OLED_CMD);

    OLED_WR_Byte(0xd5, OLED_CMD);
    OLED_WR_Byte(0xf0, OLED_CMD);

    OLED_WR_Byte(0xd9, OLED_CMD);
    OLED_WR_Byte(0x22, OLED_CMD);

    OLED_WR_Byte(0xda, OLED_CMD);
    OLED_WR_Byte(0x02, OLED_CMD);

    OLED_WR_Byte(0xdb, OLED_CMD);
    OLED_WR_Byte(0x49, OLED_CMD);

    OLED_WR_Byte(0x8d, OLED_CMD);
    OLED_WR_Byte(0x14, OLED_CMD);

    OLED_WR_Byte(0xaf, OLED_CMD);

    OLED_Clear();
    //OLED_On();
}
void Oled_PrintSmallSymbol(uint16_t x,uint16_t y,char type,char symble)//显示特殊符号(有OLED的朋友可测试一下,主要是显是电池电量,信号强度等字符)
{                                                                      //有兴趣的朋友也可以自行新定义自己的图形或符号
        int  i;
        char *sybBase;
//-----------------------------------
        switch(type)
        {
        case 'b':sybBase = (char *)BatterySmallBase;break;
        default: sybBase = (char *)BatterySmallBase;break;
        }
//-----------------------------------
        OLED_Set_Pos(x,y);
        for(i=0;i<8;i++)
                OLED_WR_Byte(sybBase[symble*16+i],OLED_DATA);
        OLED_Set_Pos(x,y+1);
        for(i=8;i<16;i++)
                OLED_WR_Byte(sybBase[symble*16+i],OLED_DATA);

}
void Oled_Printf(int x,int y,unsigned char *format,...)//类似系统的printf,注意:此处汉字是采用适用于UTF-8编码,
{
        unsigned char  ch;
        unsigned char  *str;
        int   decimal;
        int   hanzi;
        int   *ppar;
        int   len;
//-----------------------------------------------------
        ppar = (int *)(&format);
        while(*format != '\0')
        {
                if(x >= 128)                //换行
                {
                        x %= 128;
                        y += 2;
                        if(y > 3)
                                break;
                }
//-----------------------------------------------------
                if(*format == '%')
                {
                        switch(*(++format))
                        {
            case('%'):
                                Oled_PrintChar(x,y,'%');
                x += 8;
                                break;
                        case('d'):
                                decimal = *(++ppar);
                                len     = Oled_PrintInt(x,y,decimal);
                x      += 8*len;
                                break;
                        case('c'):
                                ch = *(++ppar);
                                Oled_PrintChar(x,y,ch);
                                x += 8;
                                break;
                        case('s'):
                                str = (unsigned char *)(*(++ppar));
                                len = Oled_PrintString(x,y,str);
                x  += 8*len;
                                break;                        
                        default:
                                ch = *(++ppar);                        
                                Oled_PrintChar(x+0,y,'%');
                                Oled_PrintChar(x+8,y,*format);
                                len = Oled_PrintString(x,y,"(argument error!此参数暂未实现!)");
                                x      += 8*len;
                                break;
                        }
                        format++;
                }
//-----------------------------------------------------
                if(*format == '$')
                {
                        switch(*(++format))
                        {
            case('$'):
                                Oled_PrintChar(x,y,'$');
                x += 8;
                                break;
            case('A'):
                ch = *(++ppar);
                Oled_PrintSymbol(x,y,'A',ch);
                x += 16;
                                break;
            case('B'):
                                ch = *(++ppar);
                                Oled_PrintSymbol(x,y,'B',ch);
                                x += 16;
                                break;
            case('b'):
                                ch = *(++ppar);
                    Oled_PrintSmallSymbol(x,y,'b',ch);
                                x += 8;
                                break;
                        default:
                                Oled_PrintChar(x,y,'$');
                x += 8;
                format--;
                                break;
                        }
                        format++;
                }
//-----------------------------------------------------
                else
                {
                        if(*format < 128)                //英文
                        {
                                Oled_PrintChar(x,y,*format);
                                format += 1;
                                x      += 8;
                        }
                        else                                    //中文
                        {
                            hanzi = LoadHanziCode((uint8_t *)format);
                                Oled_PrintHanzi(x,y,hanzi);
                                format += 3;    /* 适用于UTF-8编码 */
                                x      += 16;
                        }
                }
//-----------------------------------------------------
    }

}
6.BLE部分介绍:
void Task_LedRed(void)
{
//------------------------------------
    Task_Delay(1000);
    at_cmd_send("AT+TPMODE1\r\n");
    while (1)
    {
         Task_Delay(LedRedSpeed);
         //at32_led_toggle(LED2);

         if(BleRevOk != 0)
         {                       
            switch (BleRevOk)
            {
            case 'R'://收到手机端的’R‘字符后,红色LED会被触发(亮变灭,或灭变亮)同时OLED会输出文字提示,以下类同
                at32_led_toggle(LED2);
                Oled_Printf(0, 2, "Toggle Red led. ");
                at_cmd_send("Red led is toggled!");
                break;
            case 'Y':
                at32_led_toggle(LED3);
                Oled_Printf(0, 2, "Toggle Yellow led");
                at_cmd_send("Yellow led is toggled!");
                break;
            case 'G':
                at32_led_toggle(LED4);
                Oled_Printf(0, 2, "Toggle Green led.");
                at_cmd_send("Green led is toggled!");
                break;
            }
            BleRevOk = 0;
         }
    }

}
7.自编写的操作系统简介(详见源代码)
72406302064def4f0.png
.效果图:
file:///C:/Users/190216/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
477076302066fac161.jpg
附源码为7z格式,请注意更改一下。


AtBleDemo-mm-7z.ZIP

395.1 KB, 下载次数: 15

redone 发表于 2022-9-2 21:36 | 显示全部楼层
这系统的应用领域有哪些

评论

系统是自己瞎写的,只在我们公司使用。  发表于 2022-9-5 15:22
Henryko 发表于 2022-9-7 21:19 | 显示全部楼层
研小操作系统又是什么系统?

评论

自研小系统,自己瞎写的,发文是漏了一个字  发表于 2022-9-8 07:57
Henryko 发表于 2022-9-7 21:20 | 显示全部楼层
感觉自己见识还是太少啊
tpgf 发表于 2022-9-8 16:03 | 显示全部楼层
这个开箱很有深度啊
wowu 发表于 2022-9-8 16:10 | 显示全部楼层
可以更改一下显示吗 读代码很费劲啊

评论

可以,你想改哪部分?我可以告诉你怎么改。  发表于 2022-9-9 09:55
xiaoqizi 发表于 2022-9-8 16:19 | 显示全部楼层
数据传输稳定吗
木木guainv 发表于 2022-9-8 16:28 | 显示全部楼层
这个用的是什么操作系统啊

评论

自研小系统,自己瞎写的,发文是漏了一个字  发表于 2022-9-9 10:00
八层楼 发表于 2022-9-8 16:38 | 显示全部楼层
自己都能写个系统 厉害啊
wiba 发表于 2022-9-8 16:45 | 显示全部楼层
使用的是蓝牙的哪个版本啊
 楼主| suncl110 发表于 2022-9-9 09:59 | 显示全部楼层
木木guainv 发表于 2022-9-8 16:28
这个用的是什么操作系统啊

自研小系统,自己瞎写的,发文是漏了一个字
Undshing 发表于 2022-10-5 20:58 | 显示全部楼层
这是个什么系统啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

222

帖子

3

粉丝
快速回复 返回顶部 返回列表