[活动专区] 【AT-START-WB415测评】+ 主从双核驱动蓝牙

[复制链接]
 楼主| 北方西门吹雪 发表于 2022-8-9 20:28 | 显示全部楼层 |阅读模式
本帖最后由 北方西门吹雪 于 2022-8-9 20:32 编辑


1AT32WB415的蓝牙使用一种独特的模式,是通过UART串口连接专有内核的蓝牙模块从而实现蓝牙功能的。因此,这里的双核是主从模式,主MCU常驻,作为主控,蓝牙模块作为从模块,接受AT指令,实现交互。
这种模式是一种比较常见的模式,很多蓝牙功能的芯片,都可以工作在从模块的方式,而AT32WB415则把蓝牙模块固化到芯片里,提高了PCB设计的集成度。
从蓝牙编程来说,底层的开发就完全固化到了蓝牙模块中,只要熟读AT兵书就可以快速开发。
2、使用MDK开发是一个比较方便的方式,但是这里的蓝牙从模块是使用了ARM9的指令集,需要在keil扩展开发包,安装方式如下
Capture01.PNG
具体的版本说明如下,这个扩展包使用与MDK5.25以后的版本
Capture02.PNG
3、按照说明,需要先把蓝牙模块的栈写入
3.1 下载蓝牙栈模块代码BK3432_bim,直接编译
Capture03.PNG
显然,其中的bim_app.c使用了串口通信,代码如下
  1. void bim_main(void)
  2. {
  3.      extern uint16_t uart_buff_write;
  4.      extern uint8_t bim_uart_rx_buf[BIM_UART0_RX_FIFO_MAX_COUNT];
  5.      extern uint8_t uart_download_status;
  6.     static uint16_t bim_uart_temp,uart_buff_read;
  7.      static int32_t  check_cnt=0;
  8.      static uint8_t read_buf[16];
  9.      static uint16_t rom_ver;
  10.      int32_t main_point = MAIN_IMAGE_RUN_ADDR;
  11.     updata_memset32((uint8_t *)0x00400000, 1, 1);
  12.      bim_icu_init(ICU_CLK_16M);
  13.      bim_flash_init();
  14.      bim_uart_init(115200);
  15.      bim_flash_read(FLASH_SPACE_TYPE_MAIN, 0x2010/4, 16, read_buf);
  16.     rom_ver = ( read_buf[14]|(read_buf[15]<<8) );
  17.      REG_AHB0_ICU_INT_ENABLE = (0x01 << 5);
  18.      REG_AHB0_ICU_IRQ_ENABLE = 0x03;
  19.      __enable_irq();
  20.      //bim_uart_write("boot start\r\n");
  21.      //REG_APB5_GPIOD_CFG = 0Xff;
  22.      //REG_APB5_GPIOD_DATA = 0X00;
  23.      while(1)
  24.      {
  25.           bim_uart_temp=uart_buff_write;
  26.           if (uart_buff_read < bim_uart_temp)
  27.           {
  28.                //REG_APB5_GPIOD_DATA = 0X00;
  29.                bim_uart_data_callback(bim_uart_rx_buf + uart_buff_read, bim_uart_temp - uart_buff_read);
  30.                uart_buff_read = bim_uart_temp;
  31.           }
  32.          else if (uart_buff_read > bim_uart_temp)
  33.           {
  34.                bim_uart_data_callback(bim_uart_rx_buf + uart_buff_read, sizeof(bim_uart_rx_buf) - uart_buff_read);
  35.                bim_uart_data_callback(bim_uart_rx_buf, bim_uart_temp);
  36.                uart_buff_read = bim_uart_temp;
  37.                //REG_APB5_GPIOD_DATA = 0X00;
  38.           }
  39.           else
  40.          {
  41.                if(uart_download_status==0 && rom_ver!=0xffff)
  42.                {
  43.                     if(check_cnt++>50000) //30ms
  44.                     {
  45.                          check_cnt=0;
  46.                          //REG_APB5_GPIOD_DATA = 0XFF;
  47.                          break;
  48.                     }
  49.                }
  50.           }
  51.      }
  52.      __disable_irq( );
  53.      REG_AHB0_ICU_INT_ENABLE = 0x00;
  54.      REG_AHB0_ICU_IRQ_ENABLE = 0x00;
  55.     updata_memset32((uint8_t *)0x00400000, 0, 1);
  56.      bim_uart_deinit();
  57.      if(1 == bim_select_sec())
  58.      {
  59.           //bim_uart_write("image-main_RUN ADDR = 0x2010\r\n");
  60.           (*(FUNCPTR)main_point)();
  61.      }
  62. }

这个工程只是生产了通用代码,需要用ICP模式写入共享内存的指定位置,并不能通过这个工程直接下载并调试,可以看到这个BK3432的内核是ARM9.
Capture04.PNG
启动ICP programmer,提示升级firmware,当然可以忽略,
Capture05.PNG
同样可以连接上开发板
Capture06.PNG
选择并添加适合的蓝牙固件,确定BLE的栈从0x00000000开始写入。选择下载就可以写入蓝牙栈代码。
Capture07.PNG
4、主工程代码的编译和运行,
下载并编译范例主MCU代码,这个是实现UART访问的功能,主要的功能就是标准的串口AT指令控制
Capture08.PNG
主代码如下
  1. int main(void)
  2. {     
  3.   gpio_init_typegpio_init_struct;
  4. #ifdef BT_FLASH_WR_TEST
  5.   uint8_t data;
  6. #endif
  7.    system_clock_config();
  8.    at32_board_init();
  9.   at32_button_init();
  10. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  11. nvic_irq_enable(USART3_IRQn, 0, 0);
  12. nvic_irq_enable(USART2_IRQn, 0, 1);
  13.     /* USART1configured as follow:
  14.         -BaudRate = 115200 baud  
  15.         - WordLength = 8 Bits
  16.         - One Stop Bit
  17.         - Noparity
  18.         -Hardware flow control disabled (RTS and CTS signals)
  19.         -Receive and transmit enabled
  20.   */
  21. crm_periph_clock_enable(CRM_USART3_PERIPH_CLOCK, TRUE);
  22. crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);  
  23. crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
  24. gpio_pin_remap_config(USART3_GMUX_0010, TRUE);
  25. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  26. gpio_init_struct.gpio_out_type  =GPIO_OUTPUT_PUSH_PULL;
  27.   gpio_init_struct.gpio_mode= GPIO_MODE_MUX;
  28. gpio_init_struct.gpio_pins = GPIO_PINS_7;
  29. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  30. gpio_init(GPIOA, &gpio_init_struct);
  31. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  32. gpio_init_struct.gpio_out_type  =GPIO_OUTPUT_PUSH_PULL;
  33. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  34. gpio_init_struct.gpio_pins = GPIO_PINS_6;
  35. gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  36. gpio_init(GPIOA, &gpio_init_struct);
  37. uart_print_init(115200);
  38. printf("Print Test\r\n");
  39. usart_init(USART3, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
  40. usart_transmitter_enable(USART3, TRUE);
  41. usart_receiver_enable(USART3, TRUE);
  42.   /* Enable theUSARTx Interrupt */
  43. usart_interrupt_enable(USART3, USART_RDBF_INT, TRUE);
  44.   usart_enable(USART3,TRUE);   
  45.   /* Output amessage on Hyperterminal using printf function */   
  46. delay_ms(1000);  
  47.   while (1)
  48.   {
  49.    if(at32_button_press() == USER_BUTTON)
  50.     {
  51.      UART_TP_MODE = (flag_status)!UART_TP_MODE;
  52.      if(UART_TP_MODE)
  53.       {
  54.        switch_mode_flag = SET;
  55.        at_cmd_send(AT_CMD_TP_MODE_ON);
  56.        while(cmd_rsp_get(AT_TP_MODE_OK1) != RSP_OK);
  57.        switch_mode_flag = RESET;
  58.        at32_led_on(LED3);
  59.        printf("enter uart tp mode\r\n");
  60.       }
  61.       else
  62.       {      
  63.        switch_mode_flag = SET;
  64.        at_cmd_send(AT_CMD_TP_MODE_OFF);
  65.        while(cmd_rsp_get(AT_TP_MODE_OK0) != RSP_OK);
  66.        switch_mode_flag = RESET;
  67.        at32_led_off(LED3);
  68.        printf("leave uart tp mode\r\n");
  69.       }
  70.     }   
  71.    if(UART_TP_MODE)
  72.     {
  73.      tp_mode_rx_handler();
  74.      tp_mode_tx_handler();
  75.     }
  76.     else
  77.     {
  78.      at_cmd_handler();
  79.     }
  80.   }
  81. }

这个代码可以也用ICP Programmer写入,写入地址0x08000000,这时的蓝牙栈同时写入。
Capture09.PNG
开始下载,
Capture10.PNG
开发过程先忽略用户区数据保护的功能,
Capture11.PNG
下载成功,
Capture12.PNG Capture13.PNG

这个主程序的工程已经配置为使用AT-link下载,可以直接在如下地址写入,同时继续使用蓝牙栈,这样提升了开发效率。
Capture14.PNG
5、代码运行
开发板上有BLE reset和MCU reset,以及USER用户键,重新启动开发板,初始化后,连接串口115200-8-1-N
Capture20.PNG
同时在手机端可以发现WB415-GATT的蓝牙设备
1339608049.jpg
连接成功。
2039215184.jpg 蓝牙创建连接成功Pass。
lvben5d 发表于 2022-8-9 23:51 | 显示全部楼层
楼主,请问这个蓝牙 可以直接连 PC电脑端的 蓝牙接收器不? 还是需要额外加一个蓝牙适配器 ?
yangxiaor520 发表于 2022-8-10 08:21 来自手机 | 显示全部楼层
看看,蓝牙传输距离咋样?
 楼主| 北方西门吹雪 发表于 2022-9-19 15:54 | 显示全部楼层
lvben5d 发表于 2022-8-9 23:51
楼主,请问这个蓝牙 可以直接连 PC电脑端的 蓝牙接收器不? 还是需要额外加一个蓝牙适配器 ? ...

可以直接连接
freeelectron 发表于 2022-9-25 16:22 | 显示全部楼层
这个只能叫做sip封装,算不上双核
typeof 发表于 2022-10-1 12:52 | 显示全部楼层
这个的功能怎么样                           
mmbs 发表于 2022-10-1 13:39 | 显示全部楼层
是单独开发蓝牙的吗              
wilhelmina2 发表于 2022-10-1 14:05 | 显示全部楼层
做物联网的简单了,集成了无线功能   
hearstnorman323 发表于 2022-10-1 14:31 | 显示全部楼层
这个是远程控制的首选吗              
usysm 发表于 2022-10-1 15:05 | 显示全部楼层
无线蓝牙转串口小助手可以              
htmlme 发表于 2022-10-1 15:54 | 显示全部楼层
全新一代低功耗无线蓝牙MCU,不错。   
hearstnorman323 发表于 2022-10-1 16:46 | 显示全部楼层
雅特力AT32WB415是合体芯片,一个MCU加一个蓝牙  
lzbf 发表于 2022-10-1 17:37 | 显示全部楼层
这个如何使用at指令进行驱动              
wwppd 发表于 2022-10-1 18:29 | 显示全部楼层
如何通过WB415的蓝牙模块来进行OTA升级  
caigang13 发表于 2022-10-3 11:50 来自手机 | 显示全部楼层
又见西门吹雪楼主
Undshing 发表于 2022-10-5 20:48 | 显示全部楼层
蓝牙是单独开发吗

评论

不需要,用标准at代码就可以l  发表于 2022-10-8 10:57
chenqianqian 发表于 2022-10-8 20:52 来自手机 | 显示全部楼层
内部蓝牙芯片是ARM9内核?
youtome 发表于 2022-11-1 10:08 | 显示全部楼层
如何配置蓝牙的模式呢?              
uytyu 发表于 2022-11-1 10:37 | 显示全部楼层
怎么进入AT指令配置蓝牙模块呢              
单片小菜 发表于 2022-11-11 16:33 | 显示全部楼层
求加好友,有些问题希望您指导一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

119

帖子

1

粉丝
快速回复 返回顶部 返回列表