本帖最后由 北方西门吹雪 于 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[BIM_UART0_RX_FIFO_MAX_COUNT];
extern uint8_t uart_download_status;
static uint16_t bim_uart_temp,uart_buff_read;
static int32_t check_cnt=0;
static uint8_t read_buf[16];
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[14]|(read_buf[15]<<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。
|