df_flying 发表于 2017-9-26 22:46

【MAX32630FTHR】--UART之BLE&GPS

本帖最后由 df_flying 于 2017-9-26 23:32 编辑

      MAX32630FTR其实带了一个BLE模块,可惜该模块需要通过HCI层与MCU完成通信,从而传输数据,其实在官方的DEMO程序中也有该模块程序,可惜研究了好段时间没有调试成功,后来就简单使用了基于CC2540的BT05模块了,而与该模块通信的借口就是UART了,好在FTHR将UART2通过排针给外接了出来,同时UART1通过调试口接了出来,因为调试只使用了TX,故而正好将UART1的TX接入了GPS模块,用来读取GPS数据。
      UART的初始化在之前的程序中其实都已经有了,这里不做详细的介绍,直接看程序好了
/**
P3_0RX   P3_1TX
*/
const uart_cfg_t ble_uart_cfg = {
    .parity = UART_PARITY_DISABLE,
    .size = UART_DATA_SIZE_8_BITS,
    .extra_stop = 0,
    .cts = 0,
    .rts = 0,
    .baud = 57600,
};

const sys_cfg_uart_t ble_sys_cfg = {
    .clk_scale = CLKMAN_SCALE_DIV_4,
    .io_cfg = IOMAN_UART(2, IOMAN_MAP_A, IOMAN_MAP_UNUSED, IOMAN_MAP_UNUSED, 1, 0, 0)
};
const gpio_cfg_t ble_uart_rx_tx = { PORT_3, (PIN_0 | PIN_1), GPIO_FUNC_GPIO, GPIO_PAD_INPUT };       /**< GPIO configuration object for the UART Receive (RX) Pin for Console I/O. */
//const gpio_cfg_t ble_uart_tx = { PORT_3, PIN_1, GPIO_FUNC_GPIO, GPIO_PAD_INPUT };       /**< GPIO configuration object for the UART Transmit (TX) Pin for Console I/O. */

int ble_uartInit(void)
{
    int err;

            if ((err = GPIO_Config(&ble_uart_rx_tx)) != E_NO_ERROR) {
             return err;
      }
                                                
    if ((err = UART_Init(MXC_UART_GET_UART(2), &ble_uart_cfg, &ble_sys_cfg)) != E_NO_ERROR) {
      MXC_ASSERT_FAIL();
      return err;
    }

    return E_NO_ERROR;
}

   蓝牙的其实就是串口的发送了,这里直接使用了BLE测试工具,用于蓝牙的收发了
    测试代码
void ble_uartTest(void)
{
      unsigned char str[]="123456789abcdefghijklmn";
ble_uartSend(str,sizeof(str));

}


   GPS模块使用的是UART1的TX,这里使用的模块是NEO-6M,其实原本想使用max-7q的小封装,正好也符合本次的工程,不过这在数据处理上都是一样的,这里利用第三方软件将GPS模块的模块刷新率降低到了1HZ,采用的是中断接收的方式,处理代码如下static uint8_t s_nmeastate = NMEA_INIT;
//printf("%c",sg_aRxBuffer);
switch(s_nmeastate)
{
    case NMEA_INIT:
      if(sg_aRxBuffer == '$')
      {
      sg_ppb.idx_curline = 0;
      ppbWriteByte(&sg_ppb, sg_aRxBuffer);
      s_nmeastate = NMEA_RECEIVING;
      }
      break;

    case NMEA_RECEIVING:
      if((sg_aRxBuffer == '\r') || (sg_aRxBuffer == '\n'))
      {
      ppbSwapBuffer(&sg_ppb);
      s_nmeastate = NMEA_INIT;
get_message_flag=1;
      //printf("%s",sg_ppb);
                        }
      else
      {
      ppbWriteByte(&sg_ppb, sg_aRxBuffer);
      }
      break;
}
得到的数据使用string.h中的函数还是比较好分开的,测试结果如下,数据有加权处理

模块连接如图此处在处理GPS接收时,用到了FREERTOS,这里首先附上freeRTOS的模版代码见附件




页: [1]
查看完整版本: 【MAX32630FTHR】--UART之BLE&GPS