#申请开发板# 前言:收到开发板板了,下载了官方资料,官方资料还是很齐全的。感兴趣的小伙伴可以去官网看看。能让你解决绝大数的问题,这里不在赘述。本次主要是做FREERTOS移植和官方蓝牙+呼吸灯的测试。在开始前先下载相关资料: https://www.arterytek.com/cn/product/AT32WB415.jsp#Resource 废话不多说直接开整: 1. 讲FreeRtos源码导入到刚工程中,如下图: file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml4280/wps1.jpg 2. 在FreeRtos的例子中直接复制一个M4核的FreeRtosconfig.h头文件;修改此头文件,最主要的就是注释掉(#define xPortSysTickHandler SysTick_Handler),系统的滴答定时器中断,后面自己修改。给RTOS添加心跳包。 3. 添加心跳包:修改官方给的void delay_init(void)函数。如下图: file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml4280/wps2.jpg 在系统中断加入RTOS的心跳包: file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml4280/wps3.jpg 函数原型如下: file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml4280/wps4.jpg 编译,此时会报错。 file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml4280/wps5.jpg 按一般情况只需要设置下左图的single precision参数即可; file:///C:/Users/Administrator/AppData/Local/Temp/ksohtml4280/wps6.jpgfile:///C:/Users/Administrator/AppData/Local/Temp/ksohtml4280/wps7.jpg 但是官方给的demo,没有此选项如上由图。希望官方后期加上。现在设置不了,只好修改FREERTOS源码了。分析报错原因是由于M4核的s16-s31浮点寄存器不能设置,所以我们直接修改PendSV函数里面对此寄存器设置的汇编部分。屏蔽掉此浮点寄存器的设置即可。此时编译ok,呼吸灯部分创建pwm函数初始化: void BSP_Tmr4Init(void) { gpio_init_type gpio_init_struct; tmr_output_config_type tmr_oc_init_structure; gpio_default_para_init(&gpio_init_struct); /* tmr4 clock enable */ crm_periph_clock_enable(CRM_TMR4_PERIPH_CLOCK, TRUE); /* gpioa gpiob clock enable */ crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE); gpio_init_struct.gpio_pins = GPIO_PINS_7 | GPIO_PINS_8 | GPIO_PINS_9; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init_struct.gpio_mode = GPIO_MODE_MUX; gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init(GPIOB, &gpio_init_struct); tmr_base_init(TMR4, 999, 144-1);// tmr_cnt_dir_set(TMR4, TMR_COUNT_UP); tmr_clock_source_div_set(TMR4, TMR_CLOCK_DIV1); tmr_output_default_para_init(&tmr_oc_init_structure); tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A; tmr_oc_init_structure.oc_idle_state = FALSE; tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH; tmr_oc_init_structure.oc_output_state = TRUE; tmr_output_channel_config(TMR4, TMR_SELECT_CHANNEL_4, &tmr_oc_init_structure); tmr_channel_value_set(TMR4, TMR_SELECT_CHANNEL_4, 1000); tmr_output_channel_buffer_enable(TMR4, TMR_SELECT_CHANNEL_4, TRUE); tmr_output_channel_config(TMR4, TMR_SELECT_CHANNEL_2, &tmr_oc_init_structure); tmr_channel_value_set(TMR4, TMR_SELECT_CHANNEL_2, 1000); tmr_output_channel_buffer_enable(TMR4, TMR_SELECT_CHANNEL_2, TRUE); tmr_output_channel_config(TMR4, TMR_SELECT_CHANNEL_3, &tmr_oc_init_structure); tmr_channel_value_set(TMR4, TMR_SELECT_CHANNEL_3, 1000); tmr_output_channel_buffer_enable(TMR4, TMR_SELECT_CHANNEL_3, TRUE); tmr_period_buffer_enable(TMR4, TRUE); /* tmr enable counter */ tmr_counter_enable(TMR4, TRUE); } 在创建2个任务:void LED_task(void *pvParameters)和void BLE_task(void *pvParameters); 创建一个软定时器:如下 呼吸灯任务: void LED_task(void *pvParameters) { BaseType_t err=pdFALSE; uint16_t temp_num=0; uint8_t ledflag; xTimerStart(AutoReloadTimer_Handle,0); while(1) { err=xSemaphoreTake(BinarySemaphore,portMAX_DELAY); //获取信号量 if(led_flag==1) { TMR4->c4dt =0; vTaskDelay(500); TMR4->c4dt =1000; vTaskDelay(500); } else { if(err==pdTRUE) { TMR4->c4dt=temp_num; temp_num += 10; if(temp_num>1000)temp_num=0; } } } } 蓝牙任务 void BLE_task(void *pvParameters) { 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); at32_led_on(LED3); while(cmd_rsp_get(AT_TP_MODE_OK1) != RSP_OK) { switch_mode_flag = RESET; at32_led_on(LED4); // 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_on(LED3); // printf("leave uart tp mode\r\n"); } } } if(UART_TP_MODE) { tp_mode_rx_handler(); tp_mode_tx_handler(); } else { at_cmd_handler(); } } } 软定时器任务: void Autoreload_Timer_Creat(void) { AutoReloadTimer_Handle=xTimerCreate((const char * ) "AutoTimer", (TickType_t ) 100, (UBaseType_t ) pdTRUE , (void * ) 1, (TimerCallbackFunction_t) AutoReloadCallback );//100ms } 利用官方的Artery_ICP_Programmer_V3.0.03烧录wb415_ble_app_merge.bin文件和hex文件分别对应地址0和0X08000000烧录。 最后如下: 用nrf的蓝牙工具可以看到已经连接上APP:
点进去可以看到其服务:
最后开发板的LED4以呼吸灯模式变换:此时等并不是最亮的状态。
至此,初步测试结束,总体来说这颗芯片还是不错的。
|