发帖
5 0 0

【PB-03F-kit】AT指令封装及蓝牙点灯

sujingliang
论坛元老

11

主题

13

回帖

4993

积分

论坛元老

积分
4993
PB&TG系列 688 5 2024-12-4 13:31:17
本帖最后由 sujingliang 于 2024-12-5 09:35 编辑

PB-03F-kit已经烧录了AT固件,如果不进行二次开发,直接使用AT指令对大多数应用也足够了。

AT+GMR
查看AT指令版本
  1. AT+GMR
  2. at version:release/V1.3.0
  3. sdk version:3.1.1
  4. firmware version:release/V1009
复制代码
AT+LEDTEST=1
板载的5个LED循环点亮,可以用于测试

AT+SYSIOMAP=1,7
设置7号(绿色LED)pin为输出,【手册上说:模块上的引脚(从模组左上角开始逆时针排序,从0开始)
这个序号好像和引脚序号对不上,不过都试出来了:绿色7、蓝色12、红色4、cool色22、warm色0。
AT+SYSGPIOWRITE=0,1
前面设置的0号输出IO为高电平,点亮绿色LED
AT+SYSGPIOWRITE=0,0
前面设置的0号输出IO为低电平,熄灭绿色LED

当然也可以一次设置多个IO为输出:
AT+SYSIOMAP=4,7,12,4,22
一次设置4个IO为输出。点亮22号pin:
AT+SYSGPIOWRITE=3,1

AT+PWMCFG=0,1000,500
PWM输出引脚0,周期1000us,占空比时间500us


如果要MCU来控制AT指令,还是最好封装一下,下面以AT32L021为例:
1、AT32L021使用USART4与PB-03F-kit通信
调用usart_data_transmit(USART4, (uint8_t)*cmd++);发送AT指令

  1. void PB03_AT_Send(const char *cmd )
  2. {
  3.                 if (cmd == NULL) {
  4.         // 处理错误或返回
  5.         return;
  6.     }
  7.                 Clear_Buff();
  8.     uart4_receive_complete_flag = FALSE;  // 根据需要设置标志
  9.     while (*cmd) {
  10.                         while(usart_flag_get(USART4, USART_TDBE_FLAG) == RESET);
  11.                         usart_data_transmit(USART4, (uint8_t)*cmd++);
  12.                         while(usart_flag_get(USART4, USART_TDC_FLAG) == RESET);
  13.     }
  14. }
复制代码
USART4中断处理函数,用于处理接收到信息

  1. void USART4_3_IRQHandler(void)
  2. {
  3.         char c;
  4.          if(usart_flag_get(USART4, USART_RDBF_FLAG) != RESET)
  5.   {
  6.     /* read one byte from the receive data register */
  7.                 c=usart_data_receive(USART4);
  8.     usart4_rx_buffer[usart4_rx_counter++] = c;
  9.                 printf("%c",c);
  10.                
  11.                 if(strstr((char*)usart4_rx_buffer,"S1")){
  12.                         at32_led_toggle(LED2);
  13.                         Clear_Buff();
  14.                         show_digit();
  15. }
  16. }
复制代码


2、点灯封装
LED枚举:
  1. typedef enum{
  2.         GREENLED=0,
  3.         BLUELED,
  4.         REDLED,
  5.         COOLLED,
  6.         WARMLED
  7. }PNTypeDef;
复制代码
LED对应的pin号
  1. //绿色、蓝色、红色、COOL、WARM
  2. uint8_t LED_PINS[]={7,12,4,22,0};
复制代码
  1. void PB03_LED_CONTRL(PNTypeDef pinnum,uint8_t on,uint8_t timeout)
  2. {
  3.         char cmd[22];
  4.         sprintf(cmd,"AT+SYSIOMAP=1,%d\r\n",LED_PINS[pinnum]);
  5.         
  6.         PB03_AT_Send(cmd);
  7.         PB03_wait_complete(timeout,(char*)cmd);
  8.         
  9.         if(on==1||on==0){
  10.                 sprintf(cmd,"AT+SYSGPIOWRITE=0,%d\r\n",on);
  11.                 PB03_AT_Send(cmd);
  12.                 PB03_wait_complete(timeout,(char*)cmd);
  13.         }else return;
  14. }
复制代码
发送两个命令:
设置IO为输出:

sprintf(cmd,"AT+SYSIOMAP=1,%d\r\n",LED_PINS[pinnum]);
        
PB03_AT_Send(cmd);


设置IO电平:
sprintf(cmd,"AT+SYSGPIOWRITE=0,%d\r\n",on);
PB03_AT_Send(cmd);



等待AT指令执行完成:
  1. void PB03_wait_complete(uint8_t timeout,char* fun)
  2. {
  3.         uint8_t i;
  4.         for(i = 0; i <= timeout; i++)
  5.         {
  6.                                         if (strstr( usart4_rx_buffer , "OK" ))
  7.                         {
  8.                                         //printf("\r\n %s success\r\n",fun);
  9.                                         Clear_Buff();      
  10.                                         return;
  11.                         }
  12.                         delay_ms(10);
  13.         }
  14.         //printf("%s timeout\r\n",fun);
  15. }
复制代码

调用执行PB03_LED_CONTRL(WARMLED,1,50);点亮WARM LED。

3、蓝牙控制AT32L021
AT固件提供了蓝牙广播和服务,可以通过BLE调试助手搜到abc123。
43.jpg

连接abc123,可以看到服务:
41.jpg

其中UUID为5553的服务是串口穿透服务,提供了2个特征值,第一个是发送,第二个接收。
也就是说通过这两个特征值的内容会通过串口和AT32L021通信。
手机订阅了第二个特征值,可以收到AT32L021发出的信息:
44.jpg

同样手机通过第一个特征值可以向AT32L021发送信息:
42.jpg

  1.   if(strstr((char*)usart4_rx_buffer,"S1")){
  2.                         at32_led_toggle(LED2);
  3.                         Clear_Buff();
  4.                         show_digit();
  5.                 };
复制代码
收到S1,调用show_digit();
  1. void show_digit(void)
  2. {
  3.         static uint8_t i;
  4.         char buff[3];
  5.         sprintf(buff,"%d",i++);
  6.         GUI_WriteASCII_BIG(98,60,(unsigned char*)buff,VGA_RED,VGA_BLACK);
  7. }
复制代码
show_digit()改变屏幕上的数字

tutieshi_480x270_4s (2).gif



──── 0人觉得很赞 ────

使用道具 举报

2024-12-4 14:12:20
2024-12-4 14:40:05
厉害了👍
2024-12-4 15:18:12
2024-12-4 21:43:06
这个厉害!
2024-12-5 08:49:41
不错不错~
您需要登录后才可以回帖 立即登录
高级模式
返回