本帖最后由 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, 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.自编写的操作系统简介(详见源代码) .效果图: file:///C:/Users/190216/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 附源码为7z格式,请注意更改一下。
|