对标STM32WB蓝牙,Nordic大厂,我更喜欢富芮坤这家国产IC企业,拥有0.18um、0.152um、55nm、40nm等工艺的量产经历,能够独立完成从射频、模拟、音频、协议栈、应用软件到应用产品开发的整体解决方案。是一家致力于射频集成电路芯片的设计、研发及产品销售的集成电路设计企业。其业务范围涵盖集成电路芯片、电子产品及其软件的研发、设计和销售。。          FR306x-C 系列芯片是低功耗,高安全性的高性能无线 MCU,内置了蓝牙 BR/EDR/BLE 的收发器和控制器,以及 CAN FD 总线控制器,适合应用在工业和汽车电子等广泛领域。 符合 AEC-Q100-Grade2 车规级别。FR306x-C 符合蓝牙 V5.3 标准,支持 BR 1MbpsGFSK, EDR 2Mbps π/4-DQPSK, 3Mbps 8DPSK; BLE 1M/2Mbps GFSK, 125K/500K 多种模式,支持单独打开和关闭不同的模式,支持蓝牙多主多从多连接。FR306x-C 支持 AUTOSAR 软件框架;FR306x-C 内置最多 2 个独立的 CAN FD 控制器,向下兼容CAN2.0 A/B 部分。

一、主要特点

  • 内置蓝牙模块:FR306x-C系列芯片内置了蓝牙BR/EDR/BLE的收发器和控制器,符合蓝牙V5.3标准,支持多种模式如BR 1Mbps GFSK、EDR 2Mbps π/4-DQPSK、3Mbps 8DPSK以及BLE1M/2Mbps GFSK、125K/500K等。这种设计使得FR306x-C系列芯片能够轻松实现蓝牙多主多从多连接,非常适合需要无线通信的应用场景。
  • CAN FD总线控制器:FR306x-C系列芯片内置了最多2个独立的CAN FD控制器,向下兼容CAN2.0 A/B部分。这使得FR306x-C系列芯片在工业和汽车电子等领域具有广泛的应用前景,如汽车安全系统、无钥匙进入、无线电池管理等。
  • 高性能内核:该系列芯片搭载了高性能的CM33 ARM内核,最高主频可达156MHz,以及一个主频为48MHz的蓝牙协处理器。这种组合为FR306x-C系列芯片提供了强大的处理能力,能够满足各种复杂应用的需求。

二、应用领域

  • 汽车电子:FR306x-C系列芯片的高性能和低功耗特性使其成为汽车电子领域的理想选择。它可以应用于汽车安全系统、无钥匙进入、无线电池管理等方面,提高汽车的智能化和安全性。
  • 工业领域:在工业领域,FR306x-C系列芯片同样表现出色。它可以应用于监控系统、智能楼宇、门禁等场景,实现远程监控和控制,提高工业生产的效率和安全性。

三、开发支持

  • 官方工具和示例程序:FR306x-C系列芯片的官方提供了全套的开发工具和示例程序,使得开发者能够更快速、更方便地进行项目开发。这些工具和示例程序涵盖了从硬件初始化到应用程序开发的各个环节,大大降低了开发难度。
  • 技术支持:FR306x-C系列芯片的制造商还提供了专业的技术支持服务,包括在线咨询、技术支持文档等。这些服务能够帮助开发者解决在开发过程中遇到的问题,提高开发效率。

四、开发体验

    从开发者的角度来看,FR306x-C系列芯片提供了良好的开发体验。首先,其内置的蓝牙模块和CAN FD总线控制器使得开发者能够更轻松地实现无线通信和总线通信功能。其次,官方提供的开发工具和示例程序大大降低了开发难度和成本。最后,制造商提供的技术支持服务也为开发者提供了有力的保障。FR3068E-C芯片架构属于双核架构,包括一颗独立的蓝牙核做蓝牙通讯以及另外一颗主核MCU,双核之间通过串口做HCI通讯,蓝牙核一般不对外开放,用户无需关注。

    1.png
FR3068E-C SDK是基于Freertos的系统框架,配合丰富的中断响应来实现整个代码的运行;SDK文件结构包含了MCU外设驱动,应用层的例程代码,都是以源码的形式提供;蓝牙 host部分以库的形式提供,同时提供了specification手册、公共组件、第三方软件、工具文件;内置了多种功能模块,如FlashDB存储模块、crc32算法、fatfs文件系统等等。

  GPIO mian
<pre>
  • int fputc(int ch, FILE *stream)
  • {
  •     while(__UART_IS_TxFIFO_FULL(UART3));
  •     __UART_WRITE_FIFO(UART3, ch);
  •    
  •     return ch;
  • }

  • /*********************************************************************
  • * @fn      system_clock_config
  • *
  • * @brief   System Misc Init.
  • */
  • void system_clock_config(void)
  • {
  •     System_ClkConfig_t ClkConfig;

  •     /* CORE HSCLK Config */
  •     ClkConfig.CORE_HSCLK_CFG.CORE_HSCLK_Source = CORE_HSCLK_SEL_HES;
  •     /* PLL clock = HSE_VALUE*N + (HSE_VALUE/65535)*M */
  •     /* SPLL CLK Config */
  •     ClkConfig.SPLL_CFG.PowerEn = PLL_POWER_ENABLE;
  •     ClkConfig.SPLL_CFG.PLL_N = 8;
  •     ClkConfig.SPLL_CFG.PLL_M = 0;
  •     /* PLL clock = HSE_VALUE*N + (HSE_VALUE/65535)*M */
  •     /* AUPLL CLK Config */
  •     ClkConfig.AUPLL_CFG.PowerEn = PLL_POWER_DISABLE;
  •     ClkConfig.AUPLL_CFG.PLL_N = 8;
  •     ClkConfig.AUPLL_CFG.PLL_K = 0;
  •     ClkConfig.AUPLL_CFG.PLL_D = 0;   

  •     System_CORE_HSCLK_config(&ClkConfig.CORE_HSCLK_CFG);
  •     if (System_SPLL_config(&ClkConfig.SPLL_CFG,200) == -1)
  •         while(1);   
  •     if (System_AUPLL_config(&ClkConfig.AUPLL_CFG,200) == -1)
  •         while(1);

  •     ClkConfig.MCU_Clock_Source = MCU_CLK_SEL_CORE_HSCLK;
  •     ClkConfig.SOC_DIV  = 1;    /* This parameter is valid when MCU_Clock_Source == MCU_CLK_SEL_SPLL_CLK */
  •     ClkConfig.MCU_DIV  = 1;
  •     ClkConfig.APB0_DIV = 1;
  •     ClkConfig.APB1_DIV = 1;
  •     ClkConfig.APB2_DIV = 1;

  •     System_MCU_clock_Config(&ClkConfig);
  • }

  • UART_HandleTypeDef  Uart3_handle;
  • int main(void)
  • {
  •     GPIO_InitTypeDef    GPIO_Handle;
  •    
  •     pmu_init();
  •    
  •     system_clock_config();

  •     /* Uart3 IO init */
  •     GPIO_Handle.Pin       = GPIO_PIN_4|GPIO_PIN_5;
  •     GPIO_Handle.Mode      = GPIO_MODE_AF_PP;
  •     GPIO_Handle.Pull      = GPIO_PULLUP;
  •     GPIO_Handle.Alternate = GPIO_FUNCTION_1;
  •     gpio_init(GPIOB, &GPIO_Handle);

  •     __SYSTEM_UART_CLK_SELECT_COREH();   
  •     Uart3_handle.UARTx = UART3;
  •     Uart3_handle.Init.BaudRate   = 115200;
  •     Uart3_handle.Init.DataLength = UART_DATA_LENGTH_8BIT;
  •     Uart3_handle.Init.StopBits   = UART_STOPBITS_1;
  •     Uart3_handle.Init.Parity     = UART_PARITY_NONE;
  •     Uart3_handle.Init.FIFO_Mode  = UART_FIFO_ENABLE;
  •     uart_init(&Uart3_handle);

  •     printf("SystemCoreClock:%d\r\n", system_get_CoreClock());
  •     printf("SystemDSPClock:%d\r\n", system_get_DSPClock());
  •     printf("System_CORE_HSCLK:%d\r\n", system_get_CORE_HSCLK());
  •     printf("System_SPLLCLK:%d\r\n", system_get_SPLLCLK());
  •     printf("System_AUPLLCLK:%d\r\n", system_get_AUPLLCLK());
  •    
  •     gpio_demo(GOIO_OUTPUT);
  •    
  •     while(1);
  • }
  • </pre>
  • 复制代码
    GPIO操作:
    void gpio_demo(enum_GPIO_Demo_t fe_Demo)
  • {
  •     /* init GPIO CLOCK */  
  •     __SYSTEM_GPIOB_CLK_ENABLE();
  •     __SYSTEM_GPIO_CLK_SELECT_COREH();
  •    
  •     printf("gpio clock:%d\r\n", system_get_peripheral_clock( PER_CLK_GPIOx));

  •     switch(fe_Demo)
  •     {
  •         case GOIO_OUTPUT:
  •         {
  •                         GPIO_Handle.Pin  = GPIO_PIN_14|GPIO_PIN_15;
  •                         GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
  •                         GPIO_Handle.Pull = GPIO_PULLUP;
  •                         gpio_init(GPIOD, &GPIO_Handle);

  •             while(1)
  •             {
  •                 //pin Output high Level
  •                 gpio_write_pin(GPIOD, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
  •                 system_delay_us(100000);
  •                
  •                 //pin Output low Level
  •                 gpio_write_pin(GPIOD, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_CLEAR);
  •                 system_delay_us(100000);               
  •             }
  •         }
  •         
  •         case GPIO_INPUT:
  •         {
  •                         GPIO_Handle.Pin  = GPIO_PIN_0|GPIO_PIN_1;
  •                         GPIO_Handle.Mode = GPIO_MODE_INPUT;
  •                         GPIO_Handle.Pull = GPIO_PULLUP;            
  •                         gpio_init(GPIOB, &GPIO_Handle);

  •             while(1)
  •             {
  •                 Pin_value = gpio_read_pin(GPIOB, GPIO_PIN_0);
  •                 printf("portb0 pin value is %d\r\n",Pin_value);
  •                 system_delay_us(10000);               
  •                
  •                 Pin_value = gpio_read_pin(GPIOB, GPIO_PIN_1);
  •                 printf("portb1 pin value is %d\r\n",Pin_value);
  •                 system_delay_us(10000);               
  •             }            
  •             
  •         }
  •         
  •         case GPIO_EXTI_INT:
  •         {
  •                         // EXTI interrupt
  •                         GPIO_Handle.Pin  = GPIO_PIN_0|GPIO_PIN_1;
  •                         GPIO_Handle.Mode = GPIO_MODE_EXTI_IT_FALLING;
  •                         GPIO_Handle.Pull = GPIO_PULLUP;
  •                         gpio_init(GPIOB, &GPIO_Handle);

  •                         exti_interrupt_enable(GPIOB,EXTI_LINE_0);
  •                         exti_interrupt_enable(GPIOB,EXTI_LINE_1);
  •                        
  •                         exti_clear_LineStatus(GPIOB,EXTI_LINE_0);
  •                         exti_clear_LineStatus(GPIOB,EXTI_LINE_1);
  •                        
  •                         NVIC_EnableIRQ(GPIOB_IRQn);

  •                         while (1);            
  •         }
  •         
  •         case GPIO_EXTI_SET_FILTER:
  •         {
  •                         // EXTI interrupt
  •                         GPIO_Handle.Pin  = GPIO_PIN_0;
  •                         GPIO_Handle.Mode = GPIO_MODE_EXTI_IT_HIGH_LEVEL;
  •                         GPIO_Handle.Pull = GPIO_PULLDOWN;
  •                         gpio_init(GPIOB, &GPIO_Handle);
  •             
  •                         GPIO_Handle.Pin  = GPIO_PIN_1;
  •             GPIO_Handle.Pull = GPIO_PULLUP;
  •             GPIO_Handle.Mode = GPIO_MODE_EXTI_IT_LOW_LEVEL;
  •                         gpio_init(GPIOB, &GPIO_Handle);           

  •             //Set Filter
  •             exti_set_Filter(GPIOB,EXTI_LINE_0,0,0xF);
  •             exti_set_Filter(GPIOB,EXTI_LINE_1,0,0xF);
  •             
  •                         exti_interrupt_enable(GPIOB,EXTI_LINE_0);
  •                         exti_interrupt_enable(GPIOB,EXTI_LINE_1);
  •             
  •             exti_clear_LineStatus(GPIOB,EXTI_LINE_0);
  •                         exti_clear_LineStatus(GPIOB,EXTI_LINE_1);
  •             
  •                         NVIC_EnableIRQ(GPIOB_IRQn);
  •             
  •                         while (1);           
  •         }
  •         
  •     }  
  • }

  • void gpiob_irq(void)
  • {
  •     if(exti_get_LineStatus(GPIOB,EXTI_LINE_0))
  •     {
  •         exti_clear_LineStatus(GPIOB,EXTI_LINE_0);
  •                
  •         printf("this is portb exti line 0 \r\n");   
  •     }
  •    
  •     if(exti_get_LineStatus(GPIOB,EXTI_LINE_1))
  •     {
  •         exti_clear_LineStatus(GPIOB,EXTI_LINE_1);
  •                
  •         printf("this is portb exti line 1 \r\n");   
  •     }  
  • }
  • 复制代码
    配置keil 生成BIN 脚本
    "..\..\..\..\components\tools\keil\post_process.bat" "@L" "#L" "$J"
    复制代码
    2.png
    3.png
    4.png
    点灯OK