本帖最后由 sujingliang 于 2024-12-5 09:35 编辑
PB-03F-kit已经烧录了AT固件,如果不进行二次开发,直接使用AT指令对大多数应用也足够了。
AT+GMR
查看AT指令版本
- AT+GMR
- at version:release/V1.3.0
- sdk version:3.1.1
- 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指令
- void PB03_AT_Send(const char *cmd )
- {
- if (cmd == NULL) {
- // 处理错误或返回
- return;
- }
- Clear_Buff();
- uart4_receive_complete_flag = FALSE; // 根据需要设置标志
- while (*cmd) {
- while(usart_flag_get(USART4, USART_TDBE_FLAG) == RESET);
- usart_data_transmit(USART4, (uint8_t)*cmd++);
- while(usart_flag_get(USART4, USART_TDC_FLAG) == RESET);
- }
- }
复制代码 USART4中断处理函数,用于处理接收到信息
- void USART4_3_IRQHandler(void)
- {
- char c;
- if(usart_flag_get(USART4, USART_RDBF_FLAG) != RESET)
- {
- /* read one byte from the receive data register */
- c=usart_data_receive(USART4);
- usart4_rx_buffer[usart4_rx_counter++] = c;
- printf("%c",c);
-
- if(strstr((char*)usart4_rx_buffer,"S1")){
- at32_led_toggle(LED2);
- Clear_Buff();
- show_digit();
- }
- }
复制代码
2、点灯封装
LED枚举:
- typedef enum{
- GREENLED=0,
- BLUELED,
- REDLED,
- COOLLED,
- WARMLED
- }PNTypeDef;
复制代码 LED对应的pin号
- //绿色、蓝色、红色、COOL、WARM
- uint8_t LED_PINS[]={7,12,4,22,0};
复制代码- void PB03_LED_CONTRL(PNTypeDef pinnum,uint8_t on,uint8_t timeout)
- {
- char cmd[22];
- sprintf(cmd,"AT+SYSIOMAP=1,%d\r\n",LED_PINS[pinnum]);
-
- PB03_AT_Send(cmd);
- PB03_wait_complete(timeout,(char*)cmd);
-
- if(on==1||on==0){
- sprintf(cmd,"AT+SYSGPIOWRITE=0,%d\r\n",on);
- PB03_AT_Send(cmd);
- PB03_wait_complete(timeout,(char*)cmd);
- }else return;
- }
复制代码 发送两个命令:
设置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指令执行完成:
- void PB03_wait_complete(uint8_t timeout,char* fun)
- {
- uint8_t i;
- for(i = 0; i <= timeout; i++)
- {
- if (strstr( usart4_rx_buffer , "OK" ))
- {
- //printf("\r\n %s success\r\n",fun);
- Clear_Buff();
- return;
- }
- delay_ms(10);
- }
- //printf("%s timeout\r\n",fun);
- }
复制代码
调用执行PB03_LED_CONTRL(WARMLED,1,50);点亮WARM LED。
3、蓝牙控制AT32L021
AT固件提供了蓝牙广播和服务,可以通过BLE调试助手搜到abc123。
连接abc123,可以看到服务:
其中UUID为5553的服务是串口穿透服务,提供了2个特征值,第一个是发送,第二个接收。
也就是说通过这两个特征值的内容会通过串口和AT32L021通信。
手机订阅了第二个特征值,可以收到AT32L021发出的信息:
同样手机通过第一个特征值可以向AT32L021发送信息:
- if(strstr((char*)usart4_rx_buffer,"S1")){
- at32_led_toggle(LED2);
- Clear_Buff();
- show_digit();
- };
复制代码 收到S1,调用show_digit();
- void show_digit(void)
- {
- static uint8_t i;
- char buff[3];
- sprintf(buff,"%d",i++);
- GUI_WriteASCII_BIG(98,60,(unsigned char*)buff,VGA_RED,VGA_BLACK);
- }
复制代码 show_digit()改变屏幕上的数字
|