打印
[活动专区]

AT32WB415测评移植FREERTOS+BLE

[复制链接]
533|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请开发板#
前言:收到开发板板了,下载了官方资料,官方资料还是很齐全的。感兴趣的小伙伴可以去官网看看。能让你解决绝大数的问题,这里不在赘述。本次主要是做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文件分别对应地址00X08000000烧录。
最后如下:
nrf的蓝牙工具可以看到已经连接上APP


点进去可以看到其服务:



最后开发板的LED4以呼吸灯模式变换:此时等并不是最亮的状态。
至此,初步测试结束,总体来说这颗芯片还是不错的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

53

帖子

1

粉丝