打印
[活动专区]

【AT-START-WB415测评】+基于Eclips+gcc实现BLE+OLED+研小操作系统

[复制链接]
1393|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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部分介绍:
[size=13.3333px]void Oled_Init(void)//初始化OLED
[size=13.3333px]{
[size=13.3333px]    I2C_Init();
[size=13.3333px]    I2C_Delay(100);
[size=13.3333px]    OLED_WR_Byte(0xAE, OLED_CMD); //关闭显示
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0x40, OLED_CMD); //---set low column address
[size=13.3333px]    OLED_WR_Byte(0xB0, OLED_CMD); //---set high column address
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xC8, OLED_CMD); //-not offset
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0x81, OLED_CMD); //设置对比度
[size=13.3333px]    OLED_WR_Byte(0xff, OLED_CMD);
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xa1, OLED_CMD); //段重定向设置
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xa6, OLED_CMD); //
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xa8, OLED_CMD); //设置驱动路数
[size=13.3333px]    OLED_WR_Byte(0x1f, OLED_CMD);
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xd3, OLED_CMD);
[size=13.3333px]    OLED_WR_Byte(0x00, OLED_CMD);
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xd5, OLED_CMD);
[size=13.3333px]    OLED_WR_Byte(0xf0, OLED_CMD);
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xd9, OLED_CMD);
[size=13.3333px]    OLED_WR_Byte(0x22, OLED_CMD);
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xda, OLED_CMD);
[size=13.3333px]    OLED_WR_Byte(0x02, OLED_CMD);
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xdb, OLED_CMD);
[size=13.3333px]    OLED_WR_Byte(0x49, OLED_CMD);
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0x8d, OLED_CMD);
[size=13.3333px]    OLED_WR_Byte(0x14, OLED_CMD);
[size=13.3333px]
[size=13.3333px]    OLED_WR_Byte(0xaf, OLED_CMD);
[size=13.3333px]
[size=13.3333px]    OLED_Clear();
[size=13.3333px]    //OLED_On();
[size=13.3333px]}
[size=13.3333px]void Oled_PrintSmallSymbol(uint16_t x,uint16_t y,char type,char symble)//显示特殊符号(有OLED的朋友可测试一下,主要是显是电池电量,信号强度等字符)
[size=13.3333px]{                                                                      //有兴趣的朋友也可以自行新定义自己的图形或符号
[size=13.3333px]        int  i;
[size=13.3333px]        char *sybBase;
[size=13.3333px]//-----------------------------------
[size=13.3333px]        switch(type)
[size=13.3333px]        {
[size=13.3333px]        case 'b':sybBase = (char *)BatterySmallBase;break;
[size=13.3333px]        default: sybBase = (char *)BatterySmallBase;break;
[size=13.3333px]        }
[size=13.3333px]//-----------------------------------
[size=13.3333px]        OLED_Set_Pos(x,y);
[size=13.3333px]        for(i=0;i<8;i++)
[size=13.3333px]                OLED_WR_Byte(sybBase[symble*16+i],OLED_DATA);
[size=13.3333px]        OLED_Set_Pos(x,y+1);
[size=13.3333px]        for(i=8;i<16;i++)
[size=13.3333px]                OLED_WR_Byte(sybBase[symble*16+i],OLED_DATA);

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

[size=13.3333px]}
[size=13.3333px]6.BLE部分介绍:
[size=13.3333px]void Task_LedRed(void)
[size=13.3333px]{
[size=13.3333px]//------------------------------------
[size=13.3333px]    Task_Delay(1000);
[size=13.3333px]    at_cmd_send("AT+TPMODE1\r\n");
[size=13.3333px]    while (1)
[size=13.3333px]    {
[size=13.3333px]         Task_Delay(LedRedSpeed);
[size=13.3333px]         //at32_led_toggle(LED2);
[size=13.3333px]
[size=13.3333px]         if(BleRevOk != 0)
[size=13.3333px]         {                       
[size=13.3333px]            switch (BleRevOk)
[size=13.3333px]            {
[size=13.3333px]            case 'R'://收到手机端的’R‘字符后,红色LED会被触发(亮变灭,或灭变亮)同时OLED会输出文字提示,以下类同
[size=13.3333px]                at32_led_toggle(LED2);
[size=13.3333px]                Oled_Printf(0, 2, "Toggle Red led. ");
[size=13.3333px]                at_cmd_send("Red led is toggled!");
[size=13.3333px]                break;
[size=13.3333px]            case 'Y':
[size=13.3333px]                at32_led_toggle(LED3);
[size=13.3333px]                Oled_Printf(0, 2, "Toggle Yellow led");
[size=13.3333px]                at_cmd_send("Yellow led is toggled!");
[size=13.3333px]                break;
[size=13.3333px]            case 'G':
[size=13.3333px]                at32_led_toggle(LED4);
[size=13.3333px]                Oled_Printf(0, 2, "Toggle Green led.");
[size=13.3333px]                at_cmd_send("Green led is toggled!");
[size=13.3333px]                break;
[size=13.3333px]            }
[size=13.3333px]            BleRevOk = 0;
[size=13.3333px]         }
[size=13.3333px]    }

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

AtBleDemo-mm-7z.ZIP

395.1 KB

使用特权

评论回复
沙发
redone| | 2022-9-2 21:36 | 只看该作者
这系统的应用领域有哪些

使用特权

评论回复
评论
suncl110 2022-9-5 15:22 回复TA
系统是自己瞎写的,只在我们公司使用。 
板凳
Henryko| | 2022-9-7 21:19 | 只看该作者
研小操作系统又是什么系统?

使用特权

评论回复
评论
suncl110 2022-9-8 07:57 回复TA
自研小系统,自己瞎写的,发文是漏了一个字 
地板
Henryko| | 2022-9-7 21:20 | 只看该作者
感觉自己见识还是太少啊

使用特权

评论回复
5
tpgf| | 2022-9-8 16:03 | 只看该作者
这个开箱很有深度啊

使用特权

评论回复
6
wowu| | 2022-9-8 16:10 | 只看该作者
可以更改一下显示吗 读代码很费劲啊

使用特权

评论回复
评论
suncl110 2022-9-9 09:55 回复TA
可以,你想改哪部分?我可以告诉你怎么改。 
7
xiaoqizi| | 2022-9-8 16:19 | 只看该作者
数据传输稳定吗

使用特权

评论回复
8
木木guainv| | 2022-9-8 16:28 | 只看该作者
这个用的是什么操作系统啊

使用特权

评论回复
评论
suncl110 2022-9-9 10:00 回复TA
自研小系统,自己瞎写的,发文是漏了一个字 
9
八层楼| | 2022-9-8 16:38 | 只看该作者
自己都能写个系统 厉害啊

使用特权

评论回复
10
wiba| | 2022-9-8 16:45 | 只看该作者
使用的是蓝牙的哪个版本啊

使用特权

评论回复
11
suncl110|  楼主 | 2022-9-9 09:59 | 只看该作者
木木guainv 发表于 2022-9-8 16:28
这个用的是什么操作系统啊

自研小系统,自己瞎写的,发文是漏了一个字

使用特权

评论回复
12
Undshing| | 2022-10-5 20:58 | 只看该作者
这是个什么系统啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

221

帖子

3

粉丝