【AT-START-WB415测评】+ 主从双核驱动蓝牙
本帖最后由 北方西门吹雪 于 2022-8-9 20:32 编辑1、AT32WB415的蓝牙使用一种独特的模式,是通过UART串口连接专有内核的蓝牙模块从而实现蓝牙功能的。因此,这里的双核是主从模式,主MCU常驻,作为主控,蓝牙模块作为从模块,接受AT指令,实现交互。这种模式是一种比较常见的模式,很多蓝牙功能的芯片,都可以工作在从模块的方式,而AT32WB415则把蓝牙模块固化到芯片里,提高了PCB设计的集成度。从蓝牙编程来说,底层的开发就完全固化到了蓝牙模块中,只要熟读AT兵书就可以快速开发。2、使用MDK开发是一个比较方便的方式,但是这里的蓝牙从模块是使用了ARM9的指令集,需要在keil扩展开发包,安装方式如下 具体的版本说明如下,这个扩展包使用与MDK5.25以后的版本 3、按照说明,需要先把蓝牙模块的栈写入3.1 下载蓝牙栈模块代码BK3432_bim,直接编译 显然,其中的bim_app.c使用了串口通信,代码如下void bim_main(void)
{
extern uint16_t uart_buff_write;
extern uint8_t bim_uart_rx_buf;
extern uint8_t uart_download_status;
static uint16_t bim_uart_temp,uart_buff_read;
static int32_tcheck_cnt=0;
static uint8_t read_buf;
static uint16_t rom_ver;
int32_t main_point = MAIN_IMAGE_RUN_ADDR;
updata_memset32((uint8_t *)0x00400000, 1, 1);
bim_icu_init(ICU_CLK_16M);
bim_flash_init();
bim_uart_init(115200);
bim_flash_read(FLASH_SPACE_TYPE_MAIN, 0x2010/4, 16, read_buf);
rom_ver = ( read_buf|(read_buf<<8) );
REG_AHB0_ICU_INT_ENABLE = (0x01 << 5);
REG_AHB0_ICU_IRQ_ENABLE = 0x03;
__enable_irq();
//bim_uart_write("boot start\r\n");
//REG_APB5_GPIOD_CFG = 0Xff;
//REG_APB5_GPIOD_DATA = 0X00;
while(1)
{
bim_uart_temp=uart_buff_write;
if (uart_buff_read < bim_uart_temp)
{
//REG_APB5_GPIOD_DATA = 0X00;
bim_uart_data_callback(bim_uart_rx_buf + uart_buff_read, bim_uart_temp - uart_buff_read);
uart_buff_read = bim_uart_temp;
}
else if (uart_buff_read > bim_uart_temp)
{
bim_uart_data_callback(bim_uart_rx_buf + uart_buff_read, sizeof(bim_uart_rx_buf) - uart_buff_read);
bim_uart_data_callback(bim_uart_rx_buf, bim_uart_temp);
uart_buff_read = bim_uart_temp;
//REG_APB5_GPIOD_DATA = 0X00;
}
else
{
if(uart_download_status==0 && rom_ver!=0xffff)
{
if(check_cnt++>50000) //30ms
{
check_cnt=0;
//REG_APB5_GPIOD_DATA = 0XFF;
break;
}
}
}
}
__disable_irq( );
REG_AHB0_ICU_INT_ENABLE = 0x00;
REG_AHB0_ICU_IRQ_ENABLE = 0x00;
updata_memset32((uint8_t *)0x00400000, 0, 1);
bim_uart_deinit();
if(1 == bim_select_sec())
{
//bim_uart_write("image-main_RUN ADDR = 0x2010\r\n");
(*(FUNCPTR)main_point)();
}
}
这个工程只是生产了通用代码,需要用ICP模式写入共享内存的指定位置,并不能通过这个工程直接下载并调试,可以看到这个BK3432的内核是ARM9.启动ICP programmer,提示升级firmware,当然可以忽略, 同样可以连接上开发板选择并添加适合的蓝牙固件,确定BLE的栈从0x00000000开始写入。选择下载就可以写入蓝牙栈代码。4、主工程代码的编译和运行,下载并编译范例主MCU代码,这个是实现UART访问的功能,主要的功能就是标准的串口AT指令控制主代码如下int main(void)
{
gpio_init_typegpio_init_struct;
#ifdef BT_FLASH_WR_TEST
uint8_t data;
#endif
system_clock_config();
at32_board_init();
at32_button_init();
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
nvic_irq_enable(USART3_IRQn, 0, 0);
nvic_irq_enable(USART2_IRQn, 0, 1);
/* USART1configured as follow:
-BaudRate = 115200 baud
- WordLength = 8 Bits
- One Stop Bit
- Noparity
-Hardware flow control disabled (RTS and CTS signals)
-Receive and transmit enabled
*/
crm_periph_clock_enable(CRM_USART3_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
gpio_pin_remap_config(USART3_GMUX_0010, TRUE);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type=GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode= GPIO_MODE_MUX;
gpio_init_struct.gpio_pins = GPIO_PINS_7;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type=GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_6;
gpio_init_struct.gpio_pull = GPIO_PULL_UP;
gpio_init(GPIOA, &gpio_init_struct);
uart_print_init(115200);
printf("Print Test\r\n");
usart_init(USART3, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_transmitter_enable(USART3, TRUE);
usart_receiver_enable(USART3, TRUE);
/* Enable theUSARTx Interrupt */
usart_interrupt_enable(USART3, USART_RDBF_INT, TRUE);
usart_enable(USART3,TRUE);
/* Output amessage on Hyperterminal using printf function */
delay_ms(1000);
while (1)
{
if(at32_button_press() == USER_BUTTON)
{
UART_TP_MODE = (flag_status)!UART_TP_MODE;
if(UART_TP_MODE)
{
switch_mode_flag = SET;
at_cmd_send(AT_CMD_TP_MODE_ON);
while(cmd_rsp_get(AT_TP_MODE_OK1) != RSP_OK);
switch_mode_flag = RESET;
at32_led_on(LED3);
printf("enter uart tp mode\r\n");
}
else
{
switch_mode_flag = SET;
at_cmd_send(AT_CMD_TP_MODE_OFF);
while(cmd_rsp_get(AT_TP_MODE_OK0) != RSP_OK);
switch_mode_flag = RESET;
at32_led_off(LED3);
printf("leave uart tp mode\r\n");
}
}
if(UART_TP_MODE)
{
tp_mode_rx_handler();
tp_mode_tx_handler();
}
else
{
at_cmd_handler();
}
}
}
这个代码可以也用ICP Programmer写入,写入地址0x08000000,这时的蓝牙栈同时写入。开始下载,开发过程先忽略用户区数据保护的功能,下载成功,
这个主程序的工程已经配置为使用AT-link下载,可以直接在如下地址写入,同时继续使用蓝牙栈,这样提升了开发效率。 5、代码运行开发板上有BLE reset和MCU reset,以及USER用户键,重新启动开发板,初始化后,连接串口115200-8-1-N 同时在手机端可以发现WB415-GATT的蓝牙设备 连接成功。蓝牙创建连接成功Pass。
楼主,请问这个蓝牙 可以直接连 PC电脑端的 蓝牙接收器不? 还是需要额外加一个蓝牙适配器 ? 看看,蓝牙传输距离咋样? lvben5d 发表于 2022-8-9 23:51
楼主,请问这个蓝牙 可以直接连 PC电脑端的 蓝牙接收器不? 还是需要额外加一个蓝牙适配器 ? ...
可以直接连接 这个只能叫做sip封装,算不上双核 这个的功能怎么样 是单独开发蓝牙的吗 做物联网的简单了,集成了无线功能 这个是远程控制的首选吗 无线蓝牙转串口小助手可以 全新一代低功耗无线蓝牙MCU,不错。 雅特力AT32WB415是合体芯片,一个MCU加一个蓝牙 这个如何使用at指令进行驱动 如何通过WB415的蓝牙模块来进行OTA升级 又见西门吹雪楼主 蓝牙是单独开发吗 内部蓝牙芯片是ARM9内核? 如何配置蓝牙的模式呢? 怎么进入AT指令配置蓝牙模块呢 求加好友,有些问题希望您指导一下
页:
[1]
2