本帖最后由 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部分介绍: [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]
|